网络最大流问题 poj1273 Drainage Ditches

来源:互联网 发布:java ee源码下载 编辑:程序博客网 时间:2024/05/19 00:10

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

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

 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 hereint 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;}


原创粉丝点击