网络最大流问题 poj1273 Drainage Ditches

 网络最大流问题。 其实想法很直观,就是找一条流的路径,然后取这条路径上的最大流量,然后更新约束条件,然后再找这样的路径。。。直到没有能继续的路径。

 找路径的方法使用的是广度优先搜索。

 ps:最近在练习c语言,c语言虽然用起来比c++墨迹,各种注意事项,但是运行速度上跟c++的确不在一个量级上。

15ms AC,源代码:

/*
 * =====================================================================================
 *
 *       Filename:  1273.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2011年12月06日 23时51分07秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  MaZheng (blog.csdn.net/mazheng1989), mazheng19891019@gmail.com
 *        Company:  Dalian University Of Technology
 *
 * =====================================================================================
 */


#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define NUM 220
#define minum(a,b) a<b?(a):(b)

//please declare parameters here
int s,t;
int N,M;
int flow[NUM][NUM];
int pre[NUM];
char visited[NUM];
int queue[NUM];
//please declare functions here.
void Input()
{
	s=1;
	t=M;
	int Si,Ei,Ci;
	int i,j;
	for(i=1;i<=M;i++)
	{
		for(j=1;j<=M;j++)
		{
			flow[i][j]=0;
		}
	}
	for(i=0;i<N;i++)
	{
		scanf("%d %d %d",&Si,&Ei,&Ci);
		flow[Si][Ei]+=Ci;
	}
}
void Output()
{
	int i,j;
	for(i=1;i<=M;i++)
	{
		for(j=1;j<=M;j++)
		{
			printf("%d ",flow[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
int bfs()
{
	int i;
	for(i=1;i<=M;i++)
	{
		visited[i]=0;
	}
	int front=0,tail=0;
	queue[tail++]=s;
	visited[s]=1;
	int u,v;
	int min=INT_MAX;
	while(front<tail)
	{
		u=queue[--tail];
		if(u==t)
			return min;
		for(v=2;v<=M;v++)
		{
			if(visited[v]==0&&flow[u][v]>0)
			{
				queue[tail++]=v;
				pre[v]=u;
				min=minum(min,flow[u][v]);
				visited[v]=1;
			}
		}
	}

	return 0;
}
int EK()
{
	int m,v,u;
	int count=0;
	while(1)
	{
		m=bfs();
		if(m==0)
			break;
		count+=m;
		v=t;
		while(v!=s)
		{
			u=pre[v];
			flow[v][u]+=m;
			flow[u][v]-=m;
			v=u;
		}
//		Output();
	}
	return count;
}
int main()
{
	freopen("input.txt","r",stdin);
	//input your ...
    while(scanf("%d %d",&N,&M)!=EOF)
	{
		Input();
//	Output();
		printf("%d\n",EK());
	}

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值