题意:没看懂。
语法分析:The redundancy ratio from point A to point B is the ratio of the maximum number of cars...,tothe maximum number of cars ...这里的to应该是除的意思。
要求的就是:A到B的最大流/A到B的一条路的流量(是所有A到B中流量最大的)。
分子好求,分母只要在dinic算法中在到达B点的时候,选择更大的流量就好了。
#include<iostream> #include<cstring> #include<cstdio> #include<iomanip> #include<queue> #define inf 0x7fffffff using 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; }