hdu 4240 Route Redundancy 最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4240
A city is made up exclusively of one-way steets.each street in the city has a capacity,which is the minimum of the capcities of the streets along that route.
The redundancy ratio from point A to point B is the ratio of the maximum number of cars that can get from point A to point B in an hour using all routes simultaneously,to the maximum number of cars thar can get from point A to point B in an hour using one route.The minimum redundancy ratio is the number of capacity of the single route with the laegest capacity.
The redundancy ratio from point A to point B is the ratio of the maximum number of cars that can get from point A to point B in an hour using all routes simultaneously,to the maximum number of cars thar can get from point A to point B in an hour using one route.The minimum redundancy ratio is the number of capacity of the single route with the laegest capacity.
题目描述:The redundancy ratio定义为:(A到B所有路径的流的和)/(A到B一条路径的流的值),求最小的The redundancy ratio(即A到B一条路径上的权值最大)。
算法分析:最大流的求解过程中更新每一条增广路的流的大小即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 0x7fffffff 10 using namespace std; 11 const int maxn=1000+10; 12 const int M = 9999999; 13 14 int n,m,A,B; 15 int from,to; 16 int d[maxn]; 17 int one; 18 struct node 19 { 20 int v,flow; 21 int next; 22 }edge[M]; 23 int head[maxn],edgenum; 24 25 void add(int u,int v,int flow) 26 { 27 edge[edgenum].v=v ;edge[edgenum].flow=flow; 28 edge[edgenum].next=head[u]; 29 head[u]=edgenum++; 30 31 edge[edgenum].v=u ;edge[edgenum].flow=0; 32 edge[edgenum].next=head[v]; 33 head[v]=edgenum++; 34 } 35 36 int bfs() 37 { 38 memset(d,0,sizeof(d)); 39 d[from]=1; 40 queue<int> Q; 41 Q.push(from); 42 while (!Q.empty()) 43 { 44 int u=Q.front() ;Q.pop() ; 45 for (int i=head[u] ;i!=-1 ;i=edge[i].next) 46 { 47 int v=edge[i].v; 48 if (!d[v] && edge[i].flow>0) 49 { 50 d[v]=d[u]+1; 51 Q.push(v); 52 if (v==to) return 1; 53 } 54 } 55 } 56 return 0; 57 } 58 59 int dfs(int u,int flow) 60 { 61 if (u==to || flow==0) 62 { 63 if (u==to) one=max(one,flow); 64 return flow; 65 } 66 int cap=flow; 67 for (int i=head[u] ;i!=-1 ;i=edge[i].next) 68 { 69 int v=edge[i].v; 70 if (d[v]==d[u]+1 && edge[i].flow>0) 71 { 72 int x=dfs(v,min(cap,edge[i].flow)); 73 edge[i].flow -= x; 74 edge[i^1].flow += x; 75 cap -= x; 76 if (cap==0) return flow; 77 } 78 } 79 return flow-cap; 80 } 81 82 double dinic() 83 { 84 double sum=0; 85 one=0; 86 while (bfs()) sum += (double)dfs(from,inf); 87 cout<<sum<<" "<<one<<endl; 88 return sum/(double)one; 89 } 90 91 int main() 92 { 93 int t,D; 94 scanf("%d",&t); 95 while (t--) 96 { 97 scanf("%d%d%d%d%d",&D,&n,&m,&A,&B); 98 memset(head,-1,sizeof(head)); 99 edgenum=0; 100 from=A; 101 to=B; 102 int a,b,c; 103 for (int i=0 ;i<m ;i++) 104 { 105 scanf("%d%d%d",&a,&b,&c); 106 add(a,b,c); 107 } 108 double ans=dinic(); 109 printf("%d %.3lf\n",D,ans); 110 } 111 return 0; 112 }