码迷,mamicode.com
首页 > 其他好文 > 详细

[SCOI2011]糖果 [差分约束]

时间:2019-07-19 22:31:04      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:scoi2011   http   template   ext   code   +=   差分   puts   ted   

 [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;
}

 

[SCOI2011]糖果 [差分约束]

标签:scoi2011   http   template   ext   code   +=   差分   puts   ted   

原文地址:https://www.cnblogs.com/lxyyyy/p/11214474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!