1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,cnt,head[100006],next[400006],u[400006],v[400006],h,t,a[100006]; 5 int ci[100006],f[100006]; 6 long long d[100006]; 7 void jia(int a1,int a2,int a3) 8 { 9 cnt++; 10 next[cnt]=head[a1]; 11 head[a1]=cnt; 12 u[cnt]=a2; 13 v[cnt]=a3; 14 } 15 int main() 16 { 17 scanf("%d%d",&n,&m); 18 for(int i=0;i<m;i++) 19 { 20 int a1,a2,a3; 21 scanf("%d%d%d",&a1,&a2,&a3); 22 if(a1==1) 23 { 24 jia(a2,a3,0); 25 jia(a3,a2,0); 26 } 27 if(a1==2) 28 {if(a2==a3){printf("-1");return 0;} 29 jia(a2,a3,1);} 30 if(a1==3) 31 jia(a3,a2,0); 32 if(a1==4) 33 {if(a2==a3){printf("-1");return 0;} 34 jia(a3,a2,1);} 35 if(a1==5) 36 jia(a2,a3,0); 37 } 38 for(int i=n;i;i--) 39 jia(0,i,1); 40 a[1]=0; 41 ci[0]++; 42 t=1; 43 f[0]=1; 44 for(;h!=t;) 45 { 46 h++; 47 if(h>100004) 48 h=1; 49 f[a[h]]=0; 50 for(int i=head[a[h]];i;i=next[i]) 51 if(d[u[i]]<d[a[h]]+v[i]) 52 { 53 d[u[i]]=d[a[h]]+v[i]; 54 ci[u[i]]++; 55 if(ci[u[i]]==n+1) 56 { 57 printf("-1\n"); 58 return 0; 59 } 60 if(!f[u[i]]) 61 { 62 t++; 63 if(t>100004) 64 t=1; 65 a[t]=u[i]; 66 f[u[i]]=1; 67 } 68 } 69 } 70 long long ans=0; 71 for(int i=1;i<=n;i++) 72 ans+=d[i]; 73 printf("%lld",ans); 74 return 0; 75 }
差分约束系统,根据条件建边跑最短路。