Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 10716 Accepted Submission(s): 3430
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define INF 1000000007 using namespace std; int N,M,cnt,T,S;//T是终点 struct Node{ int t,c; }edge[500000]; int head[100010],next1[500000]; int dis[100010]; void add(int s,int t,int c) { edge[cnt].t=t; edge[cnt].c=c; next1[cnt]=head[s]; head[s]=cnt++; } int bfs() { memset(dis,-1,sizeof(dis)); dis[S]=0; queue<int> q; q.push(S); while(!q.empty()) { int u=q.front(); q.pop(); int k=head[u]; while(k!=-1) { int v=edge[k].t; if(dis[v]==-1&&edge[k].c>0) { dis[v]=dis[u]+1; q.push(v); } k=next1[k]; } } if(dis[T]>0) return 1; return 0; } int dfs(int cur,int m) { if(cur==T) return m; int res=0,f,k=head[cur]; while(k!=-1) { if(dis[edge[k].t]==dis[cur]+1&&edge[k].c>0&&(f=dfs(edge[k].t,min(m,edge[k].c)))) { edge[k].c-=f; edge[k^1].c+=f; res+=f; m-=f; if(!m) break; } k=next1[k]; } if(!res) dis[cur]=-2; return res; } int main() { int cas; scanf("%d",&cas); while(cas--) { memset(head,-1,sizeof(head)); scanf("%d%d",&N,&M); int sx=INF,tx=-INF;//起点S和终点T的x坐标 cnt=S=T=0; for(int i=1;i<=N;i++) { int x,y; scanf("%d%d",&x,&y); if(sx>=x) {sx=x;S=i;} if(tx<=x) {tx=x;T=i;} } for(int i=0;i<M;i++) { int s,t,c; scanf("%d%d%d",&s,&t,&c); add(s,t,c); add(t,s,c); } int ans=0,res; while(bfs()) while(res=dfs(S,INF)) ans+=res; printf("%d\n",ans); } return 0; }
hdu4280 Island Transport(最大流Dinic数组模拟邻接连边)
原文:https://www.cnblogs.com/ACRykl/p/8859076.html