1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define M 6009 5 #define inf 2139062143 6 using namespace std; 7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1; 8 void jia(int a1,int a2,int a3,int a4) 9 { 10 cnt++; 11 fro[cnt]=a1; 12 u[cnt]=a2; 13 v[cnt]=a3; 14 w[cnt]=a4; 15 next[cnt]=head[a1]; 16 head[a1]=cnt; 17 return; 18 } 19 bool spfa() 20 { 21 memset(d,127,sizeof(int)*(3*n)); 22 d[1]=0; 23 f[1]=1; 24 q[1]=1; 25 int h=0,t=1; 26 for(;h<t;) 27 { 28 h++; 29 int p=q[h]; 30 f[p]=0; 31 for(int i=head[p];i;i=next[i]) 32 if(v[i]&&d[u[i]]>d[p]+w[i]) 33 { 34 d[u[i]]=d[p]+w[i]; 35 fr[u[i]]=i; 36 if(!f[u[i]]) 37 { 38 f[u[i]]=1; 39 t++; 40 q[t]=u[i]; 41 } 42 } 43 } 44 if(d[n]!=inf) 45 return 1; 46 return 0; 47 } 48 void mcf() 49 { 50 int mx=inf; 51 for(int i=fr[n];i;i=fr[fro[i]]) 52 mx=min(mx,v[i]); 53 ans1+=mx; 54 for(int i=fr[n];i;i=fr[fro[i]]) 55 { 56 v[i]-=mx; 57 v[i^1]+=mx; 58 ans+=mx*(w[i]); 59 } 60 } 61 int main() 62 { 63 scanf("%d%d",&n,&m); 64 for(int i=1;i<=m;i++) 65 { 66 int a1,a2,a3; 67 scanf("%d%d%d",&a1,&a2,&a3); 68 if(a1!=1&&a1!=n) 69 a1+=n; 70 jia(a1,a2,1,a3); 71 jia(a2,a1,0,-a3); 72 } 73 for(int i=2;i<n;i++) 74 { 75 jia(i,i+n,1,0); 76 jia(i+n,i,0,0); 77 } 78 for(;spfa();) 79 mcf(); 80 printf("%d %d\n",ans1,ans); 81 return 0; 82 }
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define M 6009 5 #define inf 2139062143 6 using namespace std; 7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1; 8 void jia(int a1,int a2,int a3,int a4) 9 { 10 cnt++; 11 fro[cnt]=a1; 12 u[cnt]=a2; 13 v[cnt]=a3; 14 w[cnt]=a4; 15 next[cnt]=head[a1]; 16 head[a1]=cnt; 17 return; 18 } 19 bool spfa() 20 { 21 memset(d,127,sizeof(int)*(3*n)); 22 d[1]=0; 23 f[1]=1; 24 q[1]=1; 25 int h=0,t=1; 26 for(;h<t;) 27 { 28 h++; 29 int p=q[h]; 30 f[p]=0; 31 for(int i=head[p];i;i=next[i]) 32 if(v[i]&&d[u[i]]>d[p]+w[i]) 33 { 34 d[u[i]]=d[p]+w[i]; 35 fr[u[i]]=i; 36 if(!f[u[i]]) 37 { 38 f[u[i]]=1; 39 t++; 40 q[t]=u[i]; 41 } 42 } 43 } 44 if(d[n]!=inf) 45 return 1; 46 return 0; 47 } 48 void mcf() 49 { 50 int mx=inf; 51 for(int i=fr[n];i;i=fr[fro[i]]) 52 mx=min(mx,v[i]); 53 ans1+=mx; 54 for(int i=fr[n];i;i=fr[fro[i]]) 55 { 56 v[i]-=mx; 57 v[i^1]+=mx; 58 ans+=mx*(w[i]); 59 } 60 } 61 int main() 62 { 63 scanf("%d%d",&n,&m); 64 for(int i=1;i<=m;i++) 65 { 66 int a1,a2,a3; 67 scanf("%d%d%d",&a1,&a2,&a3); 68 if(a1!=1&&a1!=n) 69 a1+=n; 70 jia(a1,a2,1,a3); 71 jia(a2,a1,0,-a3); 72 } 73 for(int i=2;i<n;i++) 74 { 75 jia(i,i+n,1,0); 76 jia(i+n,i,0,0); 77 } 78 for(;spfa();) 79 mcf(); 80 printf("%d %d\n",ans1,ans); 81 return 0; 82 }
不能相交,拆点费用流。