Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 42080 | Accepted: 15783 |
Description
Input
Output
Sample Input
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Output
50
Source
code:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 #define inf 0x6fffffff 6 7 int n,m; 8 int edgenum; 9 10 int vst[220]; 11 int level[220]; 12 int dis[220]; 13 14 typedef struct 15 { 16 int from,to,dis; 17 int next; 18 }Edge; 19 Edge edge[200*100]; 20 int head[210]; 21 22 void addedge(int a,int b,int c) 23 { 24 edge[edgenum].from=a,edge[edgenum].to=b,edge[edgenum].dis=c,edge[edgenum].next=head[a],head[a]=edgenum++; 25 edge[edgenum].from=b,edge[edgenum].to=a,edge[edgenum].dis=0,edge[edgenum].next=head[b],head[b]=edgenum++; 26 } 27 28 int dinic(int st,int et) //建立层次图 29 { 30 int que[220];int sta[220]; //模拟队列 31 int ans=0; 32 while(true) 33 { 34 int front,tail; 35 int u,v; 36 memset(dis,-1,sizeof(dis)); 37 front=tail=0; 38 dis[st]=0; 39 que[tail++]=st; 40 while(front<tail) 41 { 42 v=que[front++]; 43 for(int i=head[v];i!=-1;i=edge[i].next) 44 { 45 u=edge[i].to; 46 if(dis[u]==-1&&edge[i].dis>0) 47 { 48 dis[u]=dis[v]+1; 49 que[tail++]=u; 50 if(u==et) 51 { 52 front=tail; 53 break; 54 } 55 } 56 } 57 } 58 if(dis[et]==-1) 59 break; 60 int t=0; //模拟栈 61 int s=st; 62 while(true) 63 { 64 if(s!=et) //找增广路 65 { 66 int i; 67 for(i=head[s];i!=-1;i=edge[i].next) 68 if(edge[i].dis>0&&dis[edge[i].to]==dis[edge[i].from]+1) 69 break; 70 if(i!=-1) 71 { 72 sta[t++]=i; 73 s=edge[i].to; 74 } 75 else 76 { 77 if(t==0) //说明已经没有增广路可以找了 78 break; 79 dis[edge[sta[--t]].to]=-1; 80 s=edge[sta[t]].from; 81 } 82 } 83 else 84 { 85 int mindis=inf; 86 int tag; 87 for(int i=0;i<t;i++) 88 if(mindis>edge[sta[i]].dis) //寻找最短的那条边 89 { 90 mindis=edge[sta[i]].dis; 91 tag=i; 92 } 93 ans+=mindis; 94 for(int i=0;i<t;i++) 95 { 96 edge[sta[i]].dis-=mindis; 97 edge[sta[i]^1].dis+=mindis; 98 } 99 s=edge[sta[tag]].from; 100 t=tag; 101 } 102 } 103 } 104 return ans; 105 } 106 107 int main() 108 { 109 while(~scanf("%d%d",&n,&m)) 110 { 111 memset(head,-1,sizeof(head)); 112 edgenum=0; 113 for(int i=0;i<n;i++) 114 { 115 int a,b,c; 116 scanf("%d%d%d",&a,&b,&c); 117 addedge(a,b,c); 118 } 119 printf("%d\n",dinic(1,m)); 120 } 121 return 0; 122 }