神奇的差分约束??百度写的很明白(感觉其实就一句话有用)
1 #include<bits/stdc++.h> 2 #define N 200005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls tr[x][0] 6 #define rs tr[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 12 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 13 return x*f; 14 } 15 struct node{ 16 int to,next,v; 17 }e[N<<1]; 18 int head[N],cnt,q[N<<2],tot[N],n,m; 19 bool inq[N]; 20 int dis[N]; LL ans; 21 void insert(int x, int y, int v) 22 { 23 e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].v=v; head[x]=cnt; 24 } 25 bool SPFA() 26 { 27 int l=0,r=1; q[0]=0; inq[0]=1; tot[0]=1; 28 while (l<r) 29 { 30 int x=q[l++]; 31 for (int i=head[x];i;i=e[i].next) 32 if (dis[e[i].to]<dis[x]+e[i].v) 33 { 34 dis[e[i].to]=dis[x]+e[i].v; 35 if (++tot[e[i].to]>=n) return 0; 36 if (!inq[e[i].to]) 37 { 38 inq[e[i].to]=1; 39 q[r++]=e[i].to; 40 } 41 } 42 inq[x]=0; 43 } 44 return 1; 45 } 46 int main() 47 { 48 n=ra(); m=ra(); 49 for (int i=1; i<=m; i++) 50 { 51 int opt=ra(),a=ra(),b=ra(); 52 if (opt==1) insert(b,a,0),insert(a,b,0); 53 if (opt==2) { 54 if (a==b) {puts("-1"); return 0;} 55 else insert(a,b,1); 56 } 57 if (opt==3) insert(b,a,0); 58 if (opt==4){ 59 if (a==b) {puts("-1"); return 0;} 60 else insert(b,a,1); 61 } 62 if (opt==5) insert(a,b,0); 63 } 64 for (int i=n; i>=1; i--) insert(0,i,1); 65 if (!SPFA()) {puts("-1"); return 0;} 66 for (int i=1; i<=n; i++) ans+=(LL)dis[i]; 67 cout<<ans; 68 return 0; 69 }