这道题,是博主做的第一道差分约束的题。。。
什么是差分约束呢?就是有一定限制条件,情况不一定,同时满足可以差分。。。
对于这道题我们可以发现,砝码的重量只有 1 2 3
所以我们可以很轻松的,列举最大差值最小差值,再通过弗洛伊德,限制上下界。。。
最后看限制的唯一情况,符合那种情况就好了。。。
呆码:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,A,B,minn[55][55],maxn[55][55],c1,c2,c3; char ch[110]; int main() { scanf("%d%d%d",&n,&A,&B); for(int i=1;i<=n;i++) { scanf("%s",ch); int m=strlen(ch); for(int j=0;j<m;j++) { if(ch[j]=='=' || i==j+1) { minn[i][j+1]=0,maxn[i][j+1]=0; continue; } if(ch[j]=='+') { minn[i][j+1]=1,maxn[i][j+1]=2; continue; } if(ch[j]=='-') { minn[i][j+1]=-2,maxn[i][j+1]=-1; continue; } minn[i][j+1]=-2,maxn[i][j+1]=2; } } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(i!=k) for(int j=1;j<=n;j++) if(i!=j && k!=j) { minn[i][j]=max(minn[i][j],minn[i][k]+minn[k][j]); maxn[i][j]=min(maxn[i][j],maxn[i][k]+maxn[k][j]); } for(int i=1;i<=n;i++) if(i!=A && i!=B) for(int j=1;j<i;j++) if(j!=A && j!=B) { if(minn[A][i]>maxn[j][B] || minn[B][i]>maxn[j][A]) { c1++; continue; } if(minn[i][A]>maxn[B][j] || minn[i][B]>maxn[A][j]) { c3++; continue; } if((minn[A][i]==maxn[A][i] && minn[j][B]==maxn[j][B] && minn[A][i]==maxn[j][B]) || (minn[A][j]==maxn[A][j] && minn[i][B]==maxn[i][B] && minn[A][j]==maxn[i][B])) { c2++; continue; } } printf("%d %d %d ",c1,c2,c3); return 0; }