POJ 1273(ISAP+隣接表)
3316 ワード
// :
// :ISAP ( )
#include<iostream>
#include<cstdio>
//#include<conio.h>
#include<string.h>
using namespace std;
const int maxn=201;
const int maxm=201;
struct node
{
int x,y,f,op,next; //x ,y ,f ,next x g ,op g
}g[maxm*2];
//first[] x g
//sumd[] i ,
//now[] x g
int first[maxn],now[maxn],sumd[maxn];
int ncount; //
int dis[maxn],fanhui[maxn],pre[maxn],tot; //dis[] ,pre[i] i g[] ,tot
void add(int x,int y,int c)
{
tot++; //tot
g[tot].x=x;
g[tot].y=y;
g[tot].f=c;
g[tot].op=tot+1; // g
g[tot].next=first[x]; // x g
first[x]=tot; // x
tot++;
//
g[tot].x=y;
g[tot].y=x;
g[tot].f=0; // 0
g[tot].op=tot-1;
g[tot].next=first[y];
first[y]=tot;
}
//ISAP
int maxflow(int src,int des)
{
int i,flow,t,j,tempmin; //i,j ,t g
bool flag; //
int sumFlow;
memset(dis,0,sizeof(dis)); // dis 0
memset(sumd,0,sizeof(sumd));
for(i=1;i<=ncount;i++)
now[i]=first[i];
sumd[0]=ncount; // 0 ncount
sumFlow=0; //sumFlow , 0
i=src; //i
flow=10000000;
while(dis[src]<ncount)
{
fanhui[i]=flow;
flag=false;
t=now[i];
while(t!=0) //
{
j=g[t].y;
if((g[t].f>0)&&(dis[j]+1==dis[i])) //
{
flag=true;
pre[j]=t;
now[i]=t;
if(g[t].f<flow) //
flow=g[t].f;
i=j;
if(i==ncount) //
{
sumFlow+=flow;
while(i!=src) //
{
g[pre[i]].f-=flow; //
g[g[pre[i]].op].f+=flow; //
i=g[pre[i]].x;
}
flow=10000000;
}
break;
}
t=g[t].next;
}
if(flag)
continue;
//
tempmin=ncount-1;
t=first[i];
while(t!=0)
{
if((g[t].f>0)&&(dis[g[t].y]<tempmin))
{
tempmin=dis[g[t].y];
now[i]=t;
}
t=g[t].next;
}
sumd[dis[i]]--;
if(sumd[dis[i]]==0) break; //
dis[i]=tempmin+1; // +1, d[i]=tempmin{d[j]+1|(i,j) }
sumd[dis[i]]++;
if(i!=src)
{
i=g[pre[i]].x;
flow=fanhui[i];
}
}
return sumFlow;
}
int main()
{
//freopen("1.txt","r",stdin);
int i,j;
int N,M;
int x,y,c;
int src,des; //src ,des
while(scanf("%d%d",&N,&M)!=-1)
{
memset(first,0,sizeof(first)); // first
src = 1;
des = M;
ncount = M;
tot = 0; //tot 0
for(i=0;i<N;++i)
{
cin>>x>>y>>c;
add(x,y,c);
}
printf("%d
",maxflow(src,des));
}
//getch();
return 0;
}