POJ1273

来源:互联网 发布:网络客服工资怎么算 编辑:程序博客网 时间:2024/06/08 11:05

POJ1273 Drainage Ditches

Description

一次下雨淹了Bessie的田,所以FJ建了个排水系统帮Bessie排水到。

整个排水系统由N个点,M条排水管道组成。

除起点和终点每个点每的排水量和入水量要一致,时刻每条管道有一个单位时间最大排水量f

Bessie的田就是起点v1,终点是一条小溪点vn

求单位时间整个排水系统单位时间最大排水量。

Input

第一行:两个整数,MN,意义如题。

接下来M行:

每行三个整数,SEC,表示点S和点E之间有条容量为C的排水管道。

Output

一行:一个整数,最大排水量。

solution

网络流裸题

code

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define oo 1000000000//#include<using namespace std;int m,n,ans;// instruct Edge{    int ap,v;    Edge *next,*fe;}edge[510],*ind[210];int l=0;void input(int f,int t,int c){    edge[++l].ap=t;    edge[l].v=c;    edge[l].next=ind[f];    ind[f]=&edge[l];    edge[++l].ap=f;    edge[l].v=0;    edge[l].next=ind[t];    ind[t]=&edge[l];    edge[l].fe=&edge[l-1];    edge[l-1].fe=&edge[l];}//int q[210],level[210];   //bfs构层次图bool bfs(){    memset(q,0,sizeof(q));    memset(level,0,sizeof(level));    int h=1,t=2;    q[h]=1;    level[1]=1;    while(h<t)    {        Edge *k=ind[q[h]];        for(;k!=NULL;k=k->next)        {            if(k->v==0||level[k->ap]!=0) continue;            q[t++]=k->ap;            level[k->ap]=level[ q[h] ]+1;        }        h++;    }    return level[m]!=0 ? 1:0;}int dfs(int x,int maxin) //找增广路{    if(x==m) return maxin;    int sum=0;    Edge *i=ind[x];    for(;i!=NULL;i=i->next)    {        if(maxin==sum) break;        if(level[i->ap]<=level[x]||!i->v) continue;        int k=dfs(i->ap,min(maxin-sum,i->v));        i->v-=k;        i->fe->v+=k;        sum+=k;    }    if(sum!=maxin) level[u]=0; //当前弧优化    return sum;}//int main(){    scanf("%d%d",&n,&m);    int l=1;    for(int i=1;i<=n;i++)    {        int f,t,c;        scanf("%d%d%d",&f,&t,&c);        input(f,t,c);    }    while(bfs())        ans+=dfs(1,oo);    printf("%d",ans);    return 0;}
0 0
原创粉丝点击