1 1 7 11 0 6 0 1 3 0 3 3 1 2 4 2 0 3 2 3 1 2 4 2 3 4 2 3 5 6 4 1 1 4 6 1 5 6 9
1 1.667
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define captype int const int MAXN = 1010; //点的总数 const int MAXM = 400010; //边的总数 const int INF = 1<<30; struct EDG{ int to,next; captype cap,flow; } edg[MAXM]; int eid,head[MAXN]; int gap[MAXN]; //每种距离(或可认为是高度)点的个数 int dis[MAXN]; //每个点到终点eNode 的最短距离 int cur[MAXN]; //cur[u] 表示从u点出发可流经 cur[u] 号边 int pre[MAXN]; void init(){ eid=0; memset(head,-1,sizeof(head)); } //有向边 三个参数,无向边4个参数 void addEdg(int u,int v,captype c,captype rc=0){ edg[eid].to=v; edg[eid].next=head[u]; edg[eid].cap=c; edg[eid].flow=0; head[u]=eid++; edg[eid].to=u; edg[eid].next=head[v]; edg[eid].cap=rc; edg[eid].flow=0; head[v]=eid++; } captype minOfMax; captype maxFlow_sap(int sNode,int eNode , int n){ memset(gap,0,sizeof(gap)); memset(dis,0,sizeof(dis)); memcpy(cur,head,sizeof(head)); pre[sNode]=-1; gap[0]=n; captype ans = 0; int u=sNode; while(dis[sNode]<n){ if(u==eNode){ captype mint = INF , mincap = INF; int minid ; for(int i=pre[u]; i!=-1; i=pre[edg[i^1].to]) if(mint > edg[i].cap - edg[i].flow){ mint = edg[i].cap - edg[i].flow ; minid=i; } for(int i=pre[u]; i!=-1; i=pre[edg[i^1].to]){ edg[i].flow += mint; edg[i^1].flow -=mint; if(edg[i].flow>0&&mincap>edg[i].cap) mincap=edg[i].cap; } ans += mint; u = edg[minid^1].to; if(minOfMax < mincap) minOfMax = mincap; continue; } bool flag=false; for(int i=cur[u]; i!=-1; i=edg[i].next) if(edg[i].cap-edg[i].flow>0 && dis[u]==dis[edg[i].to]+1){ cur[u]=pre[edg[i].to]=i; flag=true; break; } if(flag){ u=edg[cur[u]].to; continue; } int minh=n; for(int i=head[u]; i!=-1; i=edg[i].next) if(edg[i].cap-edg[i].flow>0 && minh>dis[edg[i].to]){ minh=dis[edg[i].to]; cur[u]=i; } gap[dis[u]]--; if(gap[dis[u]]==0) return ans; dis[u]=minh+1; gap[dis[u]]++; if(u!=sNode) u=edg[pre[u]^1].to; } return ans; } int main(){ int T; int D,N,E,A,B; int u,v,w; scanf("%d",&T); while(T--){ scanf("%d%d%d%d%d",&D,&N,&E,&A,&B); init(); while(E--){ scanf("%d%d%d",&u,&v,&w); addEdg(u,v,w); } minOfMax = 1; int ans = maxFlow_sap(A,B,N); printf("%d %.3f\n",D,(ans*1.0)/minOfMax); } }
HDU4240Route Redundancy(最大流SAP)
原文地址:http://blog.csdn.net/u010372095/article/details/46502349