码迷,mamicode.com
首页 > 其他好文 > 详细

HDU4240_Route Redundancy

时间:2014-07-05 19:53:06      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:style   blog   os   for   代码   io   

题目很简单、给一个有向图,求两点间的最大流量与任意一条路中的最大流量的比值。

最大流不说了,求出单条流量最大的路径可以用类似Spfa的方法来搞,保存到达当前点的最大流量,一直往下更新即可。

 

召唤代码君:

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 1010
#define Inf ~0U>>1
using namespace std;

vector<int> v[maxn];
int c[maxn][maxn],tag[maxn],d[maxn],a[maxn][maxn],f[maxn];
int n,m,s,t,ans,cap,cas,D,U,V,W;
int Q[maxn],bot,top;
bool can[maxn];

void _init()
{
	ans=cap=0;
	for (int i=1; i<=n; i++)
	{
		v[i].clear();
		for (int j=1; j<=n; j++) c[i][j]=a[i][j]=0;
	}
}

void bfs()
{
	for (int i=1; i<=n; i++) d[i]=9999,can[i]=false;
	Q[bot=top=1]=t,d[t]=0;
	while (bot<=top)
	{
		int cur=Q[bot++];
		for (unsigned i=0; i<v[cur].size(); i++)
		{
			if (c[v[cur][i]][cur]<=0 || d[cur]+1>=d[v[cur][i]]) continue;
			d[v[cur][i]]=d[cur]+1,Q[++top]=v[cur][i];
		}
	}
}

int dfs(int cur,int num)
{
	if (cur==t) 
	{
		cap=max(cap,num);
		return num;
	}
	int k,tmp=num;
	for (unsigned i=0; i<v[cur].size(); i++)
	{
		if (c[cur][v[cur][i]]<=0 || can[v[cur][i]] || d[cur]!=d[v[cur][i]]+1) 
			continue;
		k=dfs(v[cur][i],min(num,c[cur][v[cur][i]]));
		if (k) c[cur][v[cur][i]]-=k,c[v[cur][i]][cur]+=k,num-=k;
		if (num==0) break;
	}
	if (num) can[cur]=true;
	return tmp-num;
}

void maxedge(int cur,int num)
{
	if (num>f[cur]) f[cur]=num;
		else return;
	if (cur==t) return;
	for (unsigned i=0; i<v[cur].size(); i++) 
		maxedge(v[cur][i],min(num,a[cur][v[cur][i]]));
}

int main()
{
	//freopen("data.in","rb",stdin);
	scanf("%d",&cas);
	while (cas--)
	{
		scanf("%d%d%d%d%d",&D,&n,&m,&s,&t);
		s++,t++;
		_init();
		while (m--)
		{
			scanf("%d%d%d",&U,&V,&W);
			U++,V++;
			/*
			if (tag[U]!=D || tag[V]!=D) a[U][V]=a[V][U]=c[U][V]=c[V][U]=0;
			if (tag[U]!=D) v[U].clear(),tag[U]=D;
			if (tag[V]!=D) v[V].clear(),tag[V]=D;
			*/
			c[U][V]+=W,a[U][V]+=W;  
			v[U].push_back(V),v[V].push_back(U);
		}
		for (bfs(); d[s]<n; bfs()) ans+=dfs(s,Inf);
		for (int i=1; i<=n; i++) f[i]=cap;
		maxedge(s,Inf);
		printf("%d %.3f\n",D,ans*1.0/max(f[t],cap));
	}
	return 0;
}

  

HDU4240_Route Redundancy,布布扣,bubuko.com

HDU4240_Route Redundancy

标签:style   blog   os   for   代码   io   

原文地址:http://www.cnblogs.com/Canon-CSU/p/3822717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!