zoukankan      html  css  js  c++  java
  • [SCOI2011]糖果 [差分约束]

     [SCOI2011]糖果   #2436. 「SCOI2011」糖果

    存一下 懒得打了...

    要注意每个小朋友都要分到糖 所以需要将其和0连一条边权为1的边 

    还有俩一定不可能的情况

    #include<bits/stdc++.h>
    using namespace std;
    #define Max(x,y) (x)>(y)?(x):(y)
    #define Min(x,y) (x)>(y)?(y):(x)
    #define ll long long
    #define rg register
    const int N=1e5+5,M=10000+5,inf=0x3f3f3f3f,P=99999997;
    int n,m;
    ll ans=0;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int head[N],tot=0;
    struct edge{int v,w,nxt;}e[N<<2];
    void add(int u,int v,int w){
        e[++tot]=(edge){v,w,head[u]},head[u]=tot;
    }
    
    int dis[N],use[N];
    bool vis[N];
    void spfa(int x){
        memset(dis,-inf,sizeof(dis));
        deque<int>q;
        q.push_back(x),vis[x]=1,dis[x]=use[x]=0;
        while(!q.empty()){
            int u=q.front();
            q.pop_front(),vis[u]=0;
            ++use[u];
            if(use[u]>=n) {puts("-1");exit(0);}
            for(int i=head[u],v,w;i;i=e[i].nxt){
                v=e[i].v,w=e[i].w;
                if(dis[v]<dis[u]+w){
                    dis[v]=dis[u]+w;
                    if(!vis[v]){
                        if(q.empty()) q.push_back(v);
                        else if(dis[v]>dis[q.front()]) q.push_front(v);
                             else q.push_back(v);
                        vis[v]=1;
                    }
                }
            }
        }
    }
    
    int main(){
        freopen("in2.txt","r",stdin);
        rd(n),rd(m);
        for(int i=1,op,u,v;i<=m;++i){
            rd(op),rd(u),rd(v);
            if(op==1) add(u,v,0),add(v,u,0);
            else if(op==2){
                if(u==v) {puts("-1");exit(0);}
                add(u,v,1);
            }
            else if(op==3) add(v,u,0);
            else if(op==4){
                if(u==v) {puts("-1");exit(0);}
                add(v,u,1);
            } 
            else if(op==5) add(u,v,0);
        }
        for(int i=n;i;--i) add(0,i,1);
        spfa(0);
        for(int i=1;i<=n;++i) ans+=(ll)dis[i];
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    十四
    十三
    十二
    十一
    用Linq从一个集合选取几列得到一个新的集合-可改列名
    LINQ入门(完结篇)
    LINQ入门(下篇)
    LINQ入门(中篇)
    LINQ入门(上篇)
    MVC中View往Controllers传数据的方式-已发
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11214474.html
Copyright © 2011-2022 走看看