赤裸裸的网络流。
暴力增广路算法就能过。
/*
ID: modengd1
PROG: ditch
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <vector>
#include <memory.h>
using namespace std;
#define INF 0x7fffffff
int E[201][201];
bool used[201];
/*
void add_edge(int from,int to,int cap)
{
G[from].push_back(edge{to,cap,G[to].size()});
G[to].push_back(edge{from,0,G[from].size()-1});
}
*/
int DFS(int v,int t,int f)
{
if(v==t)
return f;
used[v]=true;
for(int i=1;i<201;i++)
{
if(!used[i]&&E[v][i]>0)
{
int d=DFS(i,t,min(f,E[v][i]));
if(d>0)
{
E[v][i]-=d;
E[i][v]+=d;
return d;
}
}
}
return 0;//没有这句可能超时
}
int max_flow(int s,int t)
{
int flow = 0;
while(true)
{
memset(used,false,sizeof(used));
int f=DFS(s,t,INF);
if(f == 0)
return flow;
flow+=f;
}
}
int main()
{
int N,M,a,b,c;
freopen("ditch.in","r",stdin);
freopen("ditch.out","w",stdout);
memset(E,0,sizeof(E));
cin>>N>>M;
for(int i=0;i<N;i++)
{
cin>>a>>b>>c;
E[a][b]+=c;
}
cout<<max_flow(1,M)<<endl;
return 0;
}
原文:http://www.cnblogs.com/modengdubai/p/4849003.html