hdu 1532

来源:互联网 发布:linux追加分区大小 编辑:程序博客网 时间:2024/06/03 23:18

#include<iostream>#include <cstdio>#include <queue>#include <algorithm>#include <cstring>#pragma comment(linker,"/stack:102400000,102400000")#define inf 99999999using namespace std;int e,head[1005];int level[1005];struct node{    int to,val;    int next;} edge[2005];void add_edge(int x,int y,int w){    edge[e].to=x;    edge[e].val=0;    edge[e].next=head[y];    head[y]=e++;    edge[e].to=y;    edge[e].val=w;    edge[e].next=head[x];    head[x]=e++;}int dfs(int now,int maxf,int t){    int ret=0,f,k;    if(now==t)        return maxf;    for(k=head[now]; k!=-1; k=edge[k].next)    {        if(level[edge[k].to]==level[now]+1&&edge[k].val>0)        {            f=dfs(edge[k].to,min(maxf-ret,edge[k].val),t);            edge[k].val-=f;            edge[k^1].val+=f;            ret+=f;            if(ret==maxf)                return ret;        }    }    if(ret==0)        level[now]=0;    return ret;}bool bfs(int s,int t){    int top,k;    queue<int> q;    q.push(s);    memset(level,0,sizeof(level));    level[s]=1;    while(!q.empty())    {        top=q.front();        q.pop();        if(top==t)            return true;        for(k=head[top]; k!=-1; k=edge[k].next)        {            if(!level[edge[k].to]&&edge[k].val>0)            {                level[edge[k].to]=level[top]+1;                q.push(edge[k].to);            }        }    }    return false;}int dinic(int s,int t){    int ans=0;    while(bfs(s,t))    {        ans+=dfs(s,inf,t);    }    return ans;}int main(){    int i,n,m;    int x,y,w;    while(scanf("%d%d",&n,&m)>0)    {        e=0;        memset(head,-1,sizeof(head));        for(i=1; i<=n; i++)        {            scanf("%d%d%d",&x,&y,&w);            add_edge(x,y,w);        }        printf("%d\n",dinic(1,m));    }    return 0;}

网络流的 入门题,没什么好说的

0 0
原创粉丝点击