poj 1273

来源:互联网 发布:托福报名 知乎 编辑:程序博客网 时间:2024/05/19 10:35

网络流 用了dinic

#include <iostream>
#include<stdio.h>
#include<string.h>
const int maxn=1001;
using namespace std;
const int inf=1<<30;
struct
{
    intto,f,next;
}e[maxn];
int head[maxn],lon;

int edgeini(int n)
{
    for(inti=1;i<=n;i++) head[i]=-1;
   lon=-1;
}

int edgemake(int from,int to,int f)
{
   e[++lon].to=to;
   e[lon].f=f;
   e[lon].next=head[from];
   head[from]=lon;
   e[++lon].to=from;
   e[lon].f=0;
   e[lon].next=head[to];
   head[to]=lon;
}

int level[maxn];
int bfs(int s,int t)
{
   memset(level,0,sizeof(level));
   level[s]=1;
    intque[maxn];
    intlon=0;
   que[++lon]=s;
    for(inti=1;i<=lon;i++)
    {
       int u=que[i];
       if(u==t) return(1);
       for(int k=head[u];k!=-1;k=e[k].next)
       if(!level[e[k].to]&&e[k].f)
       {
           level[e[k].to]=level[u]+1;
           que[++lon]=e[k].to;
       }
    }
   return(0);
}

int dfs(int now,int t,int maxf)
{
    if(now==t)return(maxf);
    intret=0;
    for(intk=head[now];k!=-1;k=e[k].next)
    {
       if(e[k].f&&level[e[k].to]==level[now]+1)
       {
           int f=dfs(e[k].to,t,min(maxf-ret,e[k].f));
           e[k].f-=f;
           e[k^1].f+=f;
           ret+=f;
           if(ret==maxf) return(ret);
       }
    }
   return(ret);
}


int dinic(int s,int t)
{
    intans=0;
   while(bfs(s,t))
    {
       ans+=dfs(s,t,inf);
//       printf("%d\n",ans);
    }
   return(ans);
}

int main()
{
//   freopen("in.txt","r",stdin);
    intn,m;
   while(scanf("%d%d",&m,&n)!=EOF)
    {
       edgeini(n);
       for(int i=1;i<=m;i++)
       {
           int from,to,f;
           scanf("%d %d%d",&from,&to,&f);
           edgemake(from,to,f);
       }
       int ans=dinic(1,n);
       printf("%d\n",ans);
    }
    return0;
}

原创粉丝点击