zoukankan      html  css  js  c++  java
  • P3275 [SCOI2011]糖果


    调了好久的差分约束,话说倒序加边真的玄学


    #include<bits/stdc++.h>
    using namespace std;
    const int bow=100010;
    int n,m,a,b,c,ne,head[bow],vist[bow],usd[bow<<2],d[bow];
    struct node{int nxt,to,dis;}eg[bow<<2];
    void adde(int u,int v,int val){eg[++ne].nxt=head[u];eg[ne].to=v;eg[ne].dis=val;head[u]=ne;}
    int spfa(){
        queue<int>q;
        q.push(0);d[0]=0;vist[0]=1;
        while(!q.empty()){
        int u=q.front();
        q.pop();vist[u]=0;
        for(int i=head[u];i;i=eg[i].nxt)
            if(d[eg[i].to]<d[u]+eg[i].dis){
                d[eg[i].to]=d[u]+eg[i].dis;usd[i]++;if(usd[i]>n-1)return 0;
                if(!vist[eg[i].to]){vist[eg[i].to]=1;q.push(eg[i].to);}
            }  
        }
       return 1;
    }
    int main()
    {
        cin>>n>>m;
        int flg=0;
        while(m--)
        {
            scanf("%d%d%d",&c,&a,&b);
            if(c==1){adde(a,b,0);adde(b,a,0);}
            if(c==2)adde(a,b,1);
            if(c==3)adde(b,a,0);
            if(c==4)adde(b,a,1);
            if(c==5)adde(a,b,0);
            if(c%2==0&&a==b)flg=1;
        }
        if(flg==1){cout<<-1;return 0;}
        for(int i=n;i>=1;i--)adde(0,i,1);
        if(!spfa())cout<<-1;
        else{
            long long ans=0;
            for(int i=1;i<=n;i++)ans+=d[i];
            cout<<ans;
        }
        
    }
  • 相关阅读:
    day11
    day10
    day9
    day8
    day7
    day6
    day14
    day13
    day12
    day11
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11445539.html
Copyright © 2011-2022 走看看