网络流板子

来源:互联网 发布:墨西哥菜 知乎 编辑:程序博客网 时间:2024/06/05 05:11
#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<cstring> #define ll long long#define inf 10000001 using namespace std; struct node{    int to,num;}edge[11000],edge1[11000]; int n,m;int s,e;int pn=1;vector<int>v[11000];int edgenum=0;int d[11000]; void link(int x,int y,int z){    node t;    t.to=y;    t.num=z;    edge[edgenum]=t;    v[x].push_back(edgenum);    edgenum++;    t.to=x;    t.num=0;    edge[edgenum]=t;    v[y].push_back(edgenum);    edgenum++;}  bool bfs(){    memset(d,0,sizeof(d));    d[s]=1;    queue<int>q;    q.push(s);    while(!q.empty()){        int t=q.front();        q.pop();        if(t==e)continue;        for(int i=0; i<v[t].size(); i++){            int x=v[t][i];            int to=edge[x].to;            int num=edge[x].num;            if(num==0 || d[to]!=0)continue;            d[to]=d[t]+1;            q.push(to);        }    }    if(d[e]!=0)return true;    return false;} ll dfs(int x,int y){    if(x==e || y==0)return y;    ll sum=0;    for(int i=0; i<v[x].size(); i++){        int j=v[x][i];        int to=edge[j].to;        int num=edge[j].num;        if(num){            if(d[to]!=d[x]+1)continue;            ll k=dfs(to,min(num,y));            y-=k;            sum+=k;            edge[j].num-=k;            edge[j^1].num+=k;            if(y==0)break;        }    }    if(sum==0)d[x]=0;    return sum;} long long ans=0; int main(){    scanf("%d%d",&n,&m);    for(int i=1; i<=m; i++){    int x,y,z;    scanf("%d%d%d",&x,&y,&z);        link(x,y,z);    }    s=1;    e=n;    while(bfs())ans+=dfs(s,inf);    printf("%lld\n",ans);         return 0;}

原创粉丝点击