题解

这道题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. Replication--复制与CDC和镜像

    复制和CDC 都是使用logreader来从日志中读取数据的变更,然后写入到分发库(复制)或变更表中. 1> 单独创建复制发布 在该情况下,会在分发服务器上创建日志读取代理作业(ServerNa ...

  2. android showDialog用法

    protected Dialog onCreateDialog(int id) { // TODO Auto-generated method stub switch(id){ case 10: re ...

  3. soapUI-DataSource

    1.1.1.1 概述 - 数据源   Option Description   Properties DataSource属性表   Toolbar DataSource工具栏   Configura ...

  4. php \r \n 和 <br/> \t

    利用\r \n 和 <br/> \t做了个实验,话不多说,看代码就很清楚的知道

  5. Git 系列——第一步安装 Git

    之前也没有用过什么版本控制的工具,唯一用过的就是 SVN 了,不过也只是简单的使用而已,比如写好代码就签入,没了?是的,没了. 于是接触到了 Git 这个分布式版本控制软件,接下来就让我们好好学习,天 ...

  6. try with resources简洁的异常捕获机制

    通过前篇的<Java文件IO流的操作总结>,我们知道了基本输入输出流的使用方式,但是每次都需要在finally处关闭流资源,这样操作起来既啰嗦又麻烦,有没有更简洁的方式呢?本篇就来讲解jd ...

  7. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  8. 587. Erect the Fence(凸包算法)

    问题 给定一群树的坐标点,画个围栏把所有树围起来(凸包). 至少有一棵树,输入和输出没有顺序. Input: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]] Output: ...

  9. 两步实现在Git Bash中用Sublime打开文件

    每次都要用鼠标点来点去才能用sublime打开文件!太不科学!今天来配置一下在Git bash中用sublime打开文件 方法 新建一个文件命名为你想要的命令,比如 subl(注意不能有后缀名),内容 ...

  10. 从e.getMessage()为null看Java异常机制

    问题:自定义异常触发了,但是自定义的提示信息RuntimeException却没有带过来. throw new RuntimeException("不允许插入报价主项和报价子项同时重复的记录 ...