标签:== c++ log pop 最大 size ace style queue
1、
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Edge{ 4 int to; 5 int w; 6 int nxt; 7 }e[5000005]; 8 int n,m,s,t,tot; 9 int head[5005]; 10 int d[5005]; 11 void add_edge(int u,int v,int w){ 12 e[tot].to=v; 13 e[tot].w=w; 14 e[tot].nxt=head[u]; 15 head[u]=tot++; 16 e[tot].to=u; 17 e[tot].w=0; 18 e[tot].nxt=head[v]; 19 head[v]=tot++; 20 } 21 bool bfs(){ 22 queue<int>Q; 23 Q.push(s); 24 memset(d,0,sizeof d); 25 d[s]=1; 26 while(!Q.empty()){ 27 int u=Q.front(); 28 Q.pop(); 29 for(int i=head[u];i!=-1;i=e[i].nxt){ 30 int v=e[i].to; 31 if(d[v]==0&&e[i].w>0){ 32 d[v]=d[u]+1; 33 Q.push(v); 34 } 35 } 36 } 37 return d[t]!=0; 38 } 39 40 int dfs(int u,int flow){ 41 if(u==t)return flow; 42 int ans=0,x=0; 43 for(int i=head[u];i!=-1;i=e[i].nxt){ 44 int v=e[i].to; 45 if (e[i].w>0&&d[v]==d[u]+1){ 46 x=dfs(v,min(flow-ans,e[i].w)); 47 ans+=x; 48 e[i].w-=x; 49 e[i^1].w+=x; 50 if(ans==flow) return flow; 51 } 52 } 53 if(ans==0) d[u]=0; 54 return ans; 55 } 56 57 int dinic(){ 58 int ans=0; 59 while(bfs()) ans+=dfs(s,INT_MAX); 60 return ans; 61 } 62 63 int main(){ 64 int t,u,v,f; 65 scanf("%d",&t); 66 while(t--){ 67 memset(head,-1,sizeof head); 68 tot=0; 69 scanf("%d%d",&n,&m); 70 for(int i=0;i<m;i++){ 71 scanf("%d%d%d",&u,&v,&f); 72 add_edge(u-1,v-1,f); 73 } 74 s=0,t=n-1; 75 int ans=dinic(); 76 printf("%d\n",ans); 77 } 78 return 0; 79 }
2、
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Edge{ 4 int to; 5 int w; 6 int nxt; 7 }e[5000005]; 8 int n,m,s,t,tot; 9 int head[5005]; 10 int d[5005]; 11 void add_edge(int u,int v,int w){ 12 e[tot].to=v; 13 e[tot].w=w; 14 e[tot].nxt=head[u]; 15 head[u]=tot++; 16 e[tot].to=u; 17 e[tot].w=0; 18 e[tot].nxt=head[v]; 19 head[v]=tot++; 20 } 21 bool bfs(){ 22 queue<int>Q; 23 Q.push(s); 24 memset(d,0,sizeof d); 25 d[s]=1; 26 while(!Q.empty()){ 27 int u=Q.front(); 28 Q.pop(); 29 for(int i=head[u];i!=-1;i=e[i].nxt){ 30 int v=e[i].to; 31 if(d[v]==0&&e[i].w>0){ 32 d[v]=d[u]+1; 33 Q.push(v); 34 } 35 } 36 } 37 return d[t]!=0; 38 } 39 40 int dfs(int u,int flow){ 41 if(u==t)return flow; 42 int ans=0,x=0; 43 for(int i=head[u];i!=-1;i=e[i].nxt){ 44 int v=e[i].to; 45 if (e[i].w>0&&d[v]==d[u]+1){ 46 x=dfs(v,min(flow-ans,e[i].w)); 47 ans+=x; 48 e[i].w-=x; 49 e[i^1].w+=x; 50 if(ans==flow) return flow; 51 } 52 } 53 if(ans==0) d[u]=0; 54 return ans; 55 } 56 57 int dinic(){ 58 int ans=0; 59 while(bfs()) ans+=dfs(s,INT_MAX); 60 return ans; 61 } 62 63 int main(){ 64 int t,u,v,f; 65 scanf("%d",&t); 66 while(t--){ 67 memset(head,-1,sizeof head); 68 tot=0; 69 scanf("%d%d",&n,&m); 70 for(int i=0;i<m;i++){ 71 scanf("%d%d%d",&u,&v,&f); 72 add_edge(u-1,v-1,f); 73 } 74 s=0,t=n-1; 75 int ans=dinic(); 76 printf("%d\n",ans); 77 } 78 return 0; 79 }
标签:== c++ log pop 最大 size ace style queue
原文地址:http://www.cnblogs.com/elpsycongroo/p/7707378.html