HDU 4240 Route Redundancy 网络流

题意:没看懂。

语法分析: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;
}



你可能感兴趣的:(网络流)