HDU 4240 Route Redundancy 网络流

来源:互联网 发布:志鸿优化设计教案 编辑:程序博客网 时间:2024/05/16 13:55

题意:没看懂。

语法分析:The redundancy ratio from point A to point B is the ratio of the maximum number of cars...,tothemaximum number of cars ...这里的to应该是除的意思。

要求的就是:A到B的最大流/A到B的一条路的流量(是所有A到B中流量最大的)。

分子好求,分母只要在dinic算法中在到达B点的时候,选择更大的流量就好了。


#include<iostream>#include<cstring>#include<cstdio>#include<iomanip>#include<queue>#define inf 0x7fffffffusing namespace std;const int node_num=2000+5;int D,N,E,A,B;int mmax;struct node{int v,flow,next;}e[node_num*node_num];int head[node_num],cnt;class Dinic{public:int spath();int Min(int a,int b){if(a<b) return a;return b;}int dfs(int u,int flow);int result();private:int dis[node_num];}dinic;int Dinic::spath(){queue<int>q;while(!q.empty()) q.pop();for(int i=0;i<=N;i++){dis[i]=-1;}dis[A]=0;q.push(A);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i+1;i=e[i].next){int v=e[i].v;if(dis[v]==-1&&e[i].flow>0){dis[v]=dis[u]+1;                q.push(v);}}}return dis[B]!=-1;}int Dinic::dfs(int u,int flow){int cost=0;if(u==B) {if(mmax<flow) mmax=flow;return flow;}for(int i=head[u];i+1;i=e[i].next){int v=e[i].v;if(dis[v]==dis[u]+1&&e[i].flow>0){int mmin=dfs(v,Min(flow-cost,e[i].flow));if(mmin>0){e[i].flow-=mmin;e[i^1].flow+=mmin;cost+=mmin;if(cost==flow) break;}else dis[v]=-1;}}return cost;}int Dinic::result(){int res=0;while(spath()){res+=dfs(A,inf);}return res;}void Init(){memset(head,-1,sizeof(head));cnt=0;}void add(int a,int b,int c){e[cnt].v=b;e[cnt].flow=c;e[cnt].next=head[a];head[a]=cnt++;e[cnt].v=a;e[cnt].flow=0;e[cnt].next=head[b];head[b]=cnt++;}void Input(){cin>>D>>N>>E>>A>>B;for(int i=1;i<=E;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c);}}void Treatment(){mmax=-1;    int k=dinic.result();    //cout<<mmax<<endl;    //cout<<k<<endl;    cout<<D<<" "<<setiosflags(ios_base::fixed)<<setprecision(3)<<k*1.0/mmax<<endl;}int main(){int p;cin>>p;while(p--){Init();Input();Treatment();}return 0;}


0 0
原创粉丝点击