题解

这道题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. OC发送短信

    - (IBAction)sendMessage1:(id)sender { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@" ...

  2. spring 返回xml数据

    要将对象以xml数据形式返回:参考:https://blog.csdn.net/Pnoter/article/details/52218363 1:创建对象时应该填上xml注解,这样才能将对象转换为x ...

  3. Centos7 Zabbix3.2安装

    实验环境: 阿里云 [zabbix@miyan ~]$ cat /etc/redhat-release CentOS Linux release (Core) 不得不说,官方文档确实强大 1.官方文档 ...

  4. POJ3070:Fibonacci(矩阵快速幂模板题)

    http://poj.org/problem?id=3070 #include <iostream> #include <string.h> #include <stdl ...

  5. PAT 1080 Graduate Admission[排序][难]

    1080 Graduate Admission(30 分) It is said that in 2011, there are about 100 graduate schools ready to ...

  6. sysbench 0.4.12安装

    前提:mysql已安装完成,请参考http://www.cnblogs.com/lizhi221/p/6813907.html   安装依赖环境包: yum install -y bzr yum in ...

  7. docker 删除所有的 docker ps -a 记录

    docker rm `docker ps -a -q` 删除的是镜像运行的实例,要删除镜像用docker rmi + 镜像名或者那串字符(image  id)

  8. linux及安全期中总结——20135227黄晓妍

    Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  9. 20145201李子璇《网络对抗》PC平台逆向破解

    20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...

  10. Java静态内存与动态内存分配的解析

    1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...