看了三天的网络流,总算是切掉一道题了...
还是要安静下来耐心的,自信的切题啊~~嘿嘿~
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct edge
{ int f,c; }g[222][222];
struct node
{ int l,p,a; }list[222];
int N,M,ans,s,t;
void init()
{
int u,v,c;
memset( g,0,sizeof(g) );
for( int i=0;i<N;i++ )
{
scanf( "%d%d%d",&u,&v,&c );
g[u][v].c+=c;
}
s=1;t=M;ans=0;
}
int find()
{
int i=1;
while( i<=M&&(list[i].p!=0||list[i].l==0) )i++;
if( i>M ) return 0;
else return i;
}
bool ford()
{
memset( list,0,sizeof(list) );
list[s].l=s;
list[s].a=9999999;
while( list[t].l==0 )
{
int i=find();
if( i==0 ) return true;
for( int j=1;j<=M;j++ )
{
if( list[j].l==0 && (g[i][j].c||g[j][i].c) ){
if( g[i][j].c-g[i][j].f>0 ){
list[j].l=i;
list[j].a=min( list[i].a,g[i][j].c-g[i][j].f );
}
if( g[j][i].f>0 ){
list[j].l=-i;
list[j].a=min( list[i].a,g[j][i].f );
}
}
}
list[i].p=1;
}
ans+=list[t].a;
return false;
}
void change()
{
int j,m,a=list[t].a;
m=t;
while( m!=s )
{
j=m;m=abs(list[m].l);
if( list[m].l>0 ) g[m][j].f+=a;
if( list[m].l<0 ) g[j][m].f-=a;
}
}
void work()
{
while(1)
{
bool p=ford();
if( p )
break;
else change();
}
printf( "%d\n",ans );
}
int main()
{
while( scanf("%d%d",&N,&M)!=EOF )
{
init();
work();
}
return 0;
}