[SCOI2008]天平

这道题,是博主做的第一道差分约束的题。。。

什么是差分约束呢?就是有一定限制条件,情况不一定,同时满足可以差分。。。

对于这道题我们可以发现,砝码的重量只有 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;
}
代码
原文地址:https://www.cnblogs.com/zzzyc/p/9227894.html