网络最大流问题。 其实想法很直观,就是找一条流的路径,然后取这条路径上的最大流量,然后更新约束条件,然后再找这样的路径。。。直到没有能继续的路径。
找路径的方法使用的是广度优先搜索。
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;
}