bzoj2330 [SCOI2011]糖果 差分约束

来源:互联网 发布:美工培训免费视频教程 编辑:程序博客网 时间:2024/06/14 22:31

分析:比较经典的差分约束,对于每种情况我们可以通过不同的连边方式来体现。
1.=,add(x,y,0),add(y,x,0)
2.<,add(x,y,1)
3.>=,add(y,x,0)
4.>,add(y,x,1)
5.<=,add(x,y,0)
其中2,4是无等于号的,如果x=y,明显无解。
然后连边,连边完以后跑spfa最长路,注意这里spfa先把所有点加入,然后一个个跑,具体看代码。答案就是所有点的dis值。其实这里的spfa类似于连了一个超级源点跑。
code:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=5e5+5;int n,m;int head[N],go[N],next[N];int q[N],in[N],vis[N],val[N],dis[N];int tot;int t=0,w=1;inline void add(int x,int y,int z){    go[++tot]=y;    val[tot]=z;    next[tot]=head[x];    head[x]=tot;}inline bool spfa(){    while (t<w)    {        int x=q[++t];        int i=head[x];        vis[x]=0;        for(int i=head[x];i;i=next[i])        {            int v=go[i];            if (dis[v]<dis[x]+val[i])            {                dis[v]=dis[x]+val[i];                in[i]++;                if (in[i]>n)return 0;                if (!vis[v])                {                    vis[v]=1;                    q[++w]=v;                }            }        }    }    return 1;}int main(){    scanf("%d%d",&n,&m);    fo(i,1,m)    {        int id,x,y;        scanf("%d%d%d",&id,&x,&y);        if (id==1)        {            add(x,y,0);            add(y,x,0);        }        if (id==2)        {            add(x,y,1);            if (x==y)            {                printf("-1\n");                return 0;            }        }        if (id==3)        {            add(y,x,0);        }        if (id==4)        {            add(y,x,1);            if (x==y)            {                printf("-1\n");                return 0;            }        }        if (id==5)        {            add(x,y,0);        }    }    fo(i,1,n)    {        vis[i]=dis[i]=1;        q[++w]=i;    }    if (!spfa())    {        printf("-1\n");        return 0;    }    ll ans=0;    fo(i,1,n)ans+=dis[i];    printf("%lld\n",ans);    return 0;}
0 0
原创粉丝点击