题目链接:http://poj.org/problem?id=1273
思路:网络流裸题
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(998244353)
#define pb push_back
#define eps 1e-6
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
const int N=100008,M=100008;
int head[N],tot,n,m,a,b,c;
struct node{
int next,c,to;}e[M];
struct max_flow{
int S,T,n;
int lev[N],q[N],cur[N],f;
void init(int _s,int _t)
{
tot=0;S=_s,T=_t,n=T+1;
FOR(i,0,n) head[i]=-1;
}
void add(int a,int b,int c)
{
e[tot].next=head[a];
e[tot].to=b;
e[tot].c=c;
head[a]=tot++;
}
void Add(int a,int b,int c)
{
add(a,b,c);
add(b,a,0);
}
int bfs()
{
FOR(i,0,n) lev[i]=0;
lev[S]=1,f=0,q[f++]=S;
FOR(i,0,f-1)
{
int u=q[i];
for(int i=head[u];i!=-1;i=e[i].next)
if(lev[e[i].to]==0&&e[i].c>0)
{
int to=e[i].to;
lev[to]=lev[u]+1;
q[f++]=to;
if(to==T) return 1;
}
}
return 0;
}
int dfs(int u,int f)
{
if(u==T) return f;
int tag=0,c;
for(int &i=cur[u];i!=-1;i=e[i].next)
{
int to=e[i].to;
if(e[i].c>0&&lev[to]==lev[u]+1)
{
c=dfs(to,min(f-tag,e[i].c));
e[i].c-=c;
e[i^1].c+=c;
tag+=c;
if(tag==f) return tag;
}
}
return tag;
}
int slove()
{
int ans=0;
while(bfs())
{
FOR(i,0,n) cur[i]=head[i];
ans+=dfs(S,inf);
}
return ans;
}
}flow;
int main()
{
cin.tie(0);
cout.tie(0);
while(~scanf("%d%d",&m,&n))
{
flow.init(1,n);
while(m--)
{
si(a),si(b),si(c);
flow.Add(a,b,c);
}
cout<<flow.slove()<<endl;
}
return 0;
}