1. 程式人生 > >bzoj 2330 糖果 差分約束

bzoj 2330 糖果 差分約束

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct bian
{
    int to,d;
}b[1120005];
int fst[120005],nxt[1120005],tot=1;
long long dis[120005],inf=214748364;
void build(int f,int t,int d)
{
    b[++tot].to=t;
    b[tot].d=d;
    nxt[tot]=fst[f];
    fst[f]=tot;
}
queue
<int>
q; bool use[120005]; int vis[120005]; int n,m; bool h=0; void spfa(int s) { use[s]=1; q.push(s); dis[s]=0; int u,v; while(!q.empty()) { u=q.front(); q.pop(); use[u]=0; for(int i=fst[u];i;i=nxt[i]) { v=b[i].to; if
(dis[v]<dis[u]+b[i].d) { dis[v]=dis[u]+b[i].d; if(!use[v]) { use[v]=1; q.push(v); vis[v]=vis[u]+1; if(vis[v]>n) { h=1
; return ; } } } } } } int main() { scanf("%d%d",&n,&m); int x,w,e,r; for(int i=1;i<=m;i++) { scanf("%d",&x); scanf("%d%d",&w,&e); switch(x) { case(1): build(w,e,0); build(e,w,0); break; case(2): build(w,e,1); break; case(3): build(e,w,0); break; case(4): build(e,w,1); break; case(5): build(w,e,0); break; } } for(int i=1;i<=n;i++) dis[i]=-inf; for(int i=1;i<=n;i++) { if(dis[i]==-inf) { spfa(i); if(h) { printf("-1"); return 0; } } } long long ans=0; for(int i=1;i<=n;i++) ans+=dis[i]; printf("%lld",ans+n); return 0; }