poj 1273(dinic....基础题)

来源:互联网 发布:哈根达斯 知乎 编辑:程序博客网 时间:2024/06/05 22:46

处理一下重边。。。。累加就是了。。。。。。。。赤裸裸的dinic模版。。。。0ms。。。


#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int inf=INT_MAX;int map1[210][210],n,m;int lev[210];queue<int> que;bool bfs(int s,int t){    int u,i,k;    memset(lev,0,sizeof(lev));    lev[s]=1;    que.push(s);    while(!que.empty()){        u=que.front();        que.pop();        for(k=1;k<=t;k++)            if(map1[u][k]>0 && !lev[k]){               lev[k]=lev[u]+1; que.push(k);            }    }    return lev[t];}int dinic(int s,int t){    int a[210],cur[210],pre[210];    int flow=0,i,u,v,k,f;    while(bfs(s,t)){        for(i=1;i<=t;i++)            cur[i]=1,a[i]=inf;        u=s;        while(1){            for(v=cur[u];v<=t;v++)                if(map1[u][v]>0 && lev[v]==lev[u]+1)                    break;            if(v<=t){                cur[u]=v+1,pre[v]=u,a[v]=map1[u][v];                if(a[v]>a[u])  a[v]=a[u];                u=v;                if(u==t){                    f=a[t],flow+=f;                    for(v=t;v!=s;v=pre[v]){                        cur[pre[v]]=v;                        map1[pre[v]][v]-=f,map1[v][pre[v]]+=f;                        a[v]-=f;                        if(map1[pre[v]][v]==0) u=pre[v];                    }                }            }else{                if(u!=s) lev[u]=inf,u=pre[u];                else break;            }        }    }    return flow;}int main(){    int i,j,u,v,f;    while(scanf("%d%d",&n,&m)!=-1){        memset(map1,0,sizeof(map1));        for(i=1;i<=n;i++){            scanf("%d%d%d",&u,&v,&f);            map1[u][v]+=f;        }        printf("%d\n",dinic(1,m));    }    return 0;}



原创粉丝点击