题解

这道题n的范围很小,所以我们可以考虑枚举+判定 
设放在天平右边的是C,D. 
以A+B<C+D为例,因为差分约束必须是差的形式,所以我们将式子变形 
B−C<D−A然后枚举D,A的取值,就得到了一个关于两个数差的不等式。设枚举的A的值为x,那么x<=A<=x 这个式子要想转换成差分的形式,需要引入一个新变量0,设dis[0]=0,那么式子可以变成x<=A−0<=x 
注意每个点都只能从[1,3]中取值,所以隐含的限制就是1<=dis[i]−dis[0]<=3。 
题目中说只有结果保证惟一的选法才统计在内,意思是对于同一对C,D只能计算一次,且如果枚举的C,D的值不同,得到的与A+B的关系不同的话,那么方案不合法。

代码:

#include<bits/stdc++.h>
const int N=;
using namespace std;
int tot,ne[N],fi[N],zz[N],c[N],mp[][],ans[];
int can[N],dis[N],n,B,A,rec[],pd;
void add(int x,int y,int z)
{
tot++;
ne[tot]=fi[x];
fi[x]=tot;
zz[tot]=y;
c[tot]=z;
}
void spfa(int x)
{
can[x]=;
for (int i=fi[x];i;i=ne[i])
if (dis[zz[i]]>dis[x]+c[i])
{
dis[zz[i]]=dis[x]+c[i];
if (can[zz[i]])
{
pd=;
return;
}
spfa(zz[i]);
if (pd) return;
}
can[x]=;
}
void build()
{
pd=;
for (int i=;i<=n;i++) dis[i]=1e9,can[i]=;
dis[]=;
}
int check1(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=vd-va-;
add(c,B,t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int check2(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=va-vd-;
add(B,c,t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int check3(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=vd-va;
add(c,B,t); add(B,c,-t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
for (int i=;i<=n;i++)
{
char s[];
scanf("%s",s+);
for (int j=;j<=n;j++)
{
if (s[j]=='+') add(i,j,-);
if (s[j]=='-') add(j,i,-);
if (s[j]=='=') add(j,i,),add(i,j,);
}
}
for (int i=;i<=n;i++) add(,i,),add(i,,-);
for (int i=;i<n;i++)
for (int j=i+;j<=n;j++)
{
if (i==A||j==B||i==B||j==A) continue;
int v1=,v2=,v3=;
for (int d=;d<=;d++)
for (int a=;a<=;a++)
{
int t1=check1(i,j,d,a);
int t2=check2(i,j,d,a);
int t3=check3(i,j,d,a);
if (!t1) v1++;
if (!t2) v2++;
if (!t3) v3++;
}
if (v1&&!v2&&!v3) ans[]++;
if (!v1&&v2&&!v3) ans[]++;
if (!v1&&!v2&&v3) ans[]++;
}
printf("%d %d %d\n",ans[],ans[],ans[]);
}

bzoj1077的更多相关文章

  1. 【BZOJ1077】天平(差分约束)

    [BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...

  2. BZOJ1077 : [SCOI2008]天平

    首先通过差分约束系统建图,用Floyed算法求出任意两个砝码差值的上下界. 然后暴力枚举放在右边的砝码C,D,通过与A,B差值的上下界分类讨论统计方案. 时间复杂度$O(N^3)$. #include ...

  3. BZOJ1077 并查集

    1077: [SCOI2008]天平 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 416  Solved: 224[Submit][Status][ ...

  4. [bzoj1077]天平

    先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA- ...

  5. BZOJ第1页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000   BZOJ1001   BZOJ1002   BZOJ1003   BZOJ1004   BZOJ1005   ...

  6. bzoj网络流

    近期看了一些bzoj的网络流,深感智商不够.不过对于网络流又有了进一步的理解. 还是mark一下吧. 献上几篇论文:1)<最小割模型在信息学竞赛中的应用> 2)<浅析一类最小割问题& ...

随机推荐

  1. Django - ORM - 进阶

    一.多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是 ...

  2. docker 离线环境安装oracle

    因测试需要,需在内网的测试环境搭建一套docker Oracle 11g环境进行测试,测试环境为redhat 6.6 安装docker 1.7,本机windows 7 环境,安装docker 17.1 ...

  3. centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课

    centos  LAMP第四部分mysql操作  忘记root密码  skip-innodb 配置慢查询日志 mysql常用操作  mysql常用操作 mysql备份与恢复   第二十二节课 mysq ...

  4. zcash 的资料

    我的比特币使用的是 electrum 2.9.3 版本.我的zcash用的是 jaxx 1.2 版. zcash又叫zec,可以在 bithumb (韩国的) 平台上进行交易zcash. zcash ...

  5. 【译】3 ways to define a JavaScript class

    本文真没啥难点,我就是为了检验我英语水平退化了没哈哈虽然我英语本来就渣翻译起来也像大白话.将原文看了一遍也码完翻译了一遍差不多一个小时,其中批注部分是自己的理解如有疏漏或误解还请指出感激不尽呐,比如J ...

  6. jq的$(function(){})与window.onload的区别

    最近一直在研究jq的源码,书写jq的代码我们通常会包裹在一个$(function(){})函数中,jq的$(function(){})也就是$(document).ready(function(){} ...

  7. mysql++使用

    Mysql++是官方发布的.一个为MySQL设计的C++语言的API.Mysql++为Mysql的C-Api的再次封装,它用STL(Standard Template Language)开发并编写,并 ...

  8. VS Code 终端窗口无法输入命令的解决方案

    问题 今天打开vs code,打开终端窗口,发现不能输入命令了 解决方法 邮件桌面 vscode的快捷键,打开“兼容性”标签,勾选"以管理员身份运行此程序" 结果 修改之后重启vs ...

  9. redhat 5 samba配置

    1.检查安装包 #rpm –qa | grep samba 必须有以下安装结果 samba-3.0.25:samba-common-3.0.25:samba-client-3.0.25:samba-s ...

  10. 内存记号(Memory Trail)[自定义的名字] --调试方法

    即使你把输出导向到文件中,运转记录花费的时间所带来的冲击,仍然足够改变程序的执行结果.如果要改善这种情况,我必须回到一个我所谓的“Memory Trails”(内存记号)的低阶技术中.为了使用 mem ...