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