hdu1532 网络流入门 dinic

来源:互联网 发布:天下游软件 编辑:程序博客网 时间:2024/05/16 09:41
#include <iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm>#include<vector>#include<map>using namespace std;const int N=405;const double esp=1e-8;int n,m;int head[N];int tot;int INF=2e9+10;void init(){    memset(head,-1,sizeof head);    tot=0;}struct Edge{    int to,w,nxt;}edge[N*2];void addEdge(int u,int v,int w){    edge[tot].to=v;    edge[tot].w=w;    edge[tot].nxt=head[u];    head[u]=tot++;    edge[tot].to=u;/*fanxiangbian*/    edge[tot].w=0;    edge[tot].nxt=head[v];    head[v]=tot++;}int level[N];int q[N];void bfs(int s,int t){    memset(level,0,sizeof level);    level[s]=1;    int front=0,rear=1;    q[front]=s;    while(front < rear ){        int x=q[front++];        for(int k=head[x];~k;k=edge[k].nxt){            int v=edge[k].to,w=edge[k].w;            if(!level[v] && w){                level[v]=level[x]+1;                q[rear++]=v;            }        }    }}int dfs(int u,int f,int t){    if(u==t) return f;    int ret=0;    for(int k=head[u];~k;k=edge[k].nxt){        int v=edge[k].to;        int w=edge[k].w;        if(level[u]+1==level[v] && f && w){            int dd=dfs(v,min(f,w),t);            edge[k].w-=dd;            edge[k^1].w+=dd;            if(u!=1)f-=dd;            ret+=dd;        }    }    return ret;}int dinic(int s,int t){    int ret=0;    while(true) {        bfs(s,t);        if(level[m]==0) break;        ret+=dfs(s,INF,t);    }    return ret;}int main(){#ifndef ONLINE_JUGDE //freopen("aaa","r",stdin);#endif // ONLINE_JUGDE    int T;    while(~scanf("%d%d",&n,&m)){        init();        for(int i=0;i<n;i++){            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            addEdge(u,v,w);        }    }    return 0;}

0 0
原创粉丝点击