题目链接:http://poj.org/problem?id=1273
最大流模板题,有必要存一下
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int map[205][205];
int pre[205];
bool vis[205];
int n,m;
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
unsigned int augment()
{
int v,i;
queue<int> q;
memset(pre,0,sizeof(pre));
memset(vis,0,sizeof(vis));
pre[1]=0;
vis[1]=1;
q.push(1);
bool bfp=false;
while(!q.empty())
{
v=q.front();
q.pop();
for(i=1;i<=m;i++)
{
if(map[v][i]>0&&vis[i]==0)
{
pre[i]=v;
vis[i]=1;
if(i==m)
{
bfp=true;
while(!q.empty())
q.pop();
break;
}
else
q.push(i);
}
}
}
if(!bfp)
return 0;
int nminflow=0x7fffffff;
v=m;
while(pre[v])
{
nminflow=min(nminflow,map[pre[v]][v]);
v=pre[v];
}
v=m;
while(pre[v])
{
map[pre[v]][v]-=nminflow;
map[v][pre[v]]+=nminflow;
v=pre[v];
}
return nminflow;
}
int main()
{
int i,a,b,c;
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]+=c;
}
unsigned int maxflow=0;
unsigned int aug;
while(aug=augment())
maxflow+=aug;
printf("%d\n",maxflow);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int num=205;
int map[num][num],vis[num],n,m,g[num];
int bfs()
{
int i,v;
queue<int> q;
memset(g,-1,sizeof(g));
q.push(1);
vis[1]=1;
g[1]=0;
while(!q.empty())
{
v=q.front();
q.pop();
for(i=1;i<=n;i++)
if(map[v][i]>0&&g[i]==-1)
{
q.push(i);
g[i]=g[v]+1;
}
}
if(g[n]==-1)
return 0;
else
return 1;
}
int dinic()
{
int i,j,maxf=0,v;
deque<int> q;
vis[1]=1;
while(bfs())
{
memset(vis,0,sizeof(vis));
q.push_back(1);
vis[1]=1;
while(!q.empty())
{
v=q.back();
if(v==n)
{
int minc=0x7fffffff;
int vs=0,st,en;
for(i=1;i<q.size();i++)
{
st=q[i-1];en=q[i];
if(minc>map[st][en])
{
minc=map[st][en];
vs=st;
}
}
//printf("minc %d\n",minc);
maxf+=minc;
for(i=1;i<q.size();i++)
{
st=q[i-1];
en=q[i];
map[st][en]-=minc;
map[en][st]+=minc;
}
while(!q.empty()&&q.back()!=vs)
{
vis[q.back()]=0;
q.pop_back();
}
}
else
{
for(i=1;i<=n;i++)
if(map[v][i]>0&&vis[i]==0&&g[i]==g[v]+1)
{
q.push_back(i);
vis[i]=1;
break;
}
if(i>n)
q.pop_back();
}
}
}
return maxf;
}
int main()
{
int i,j,a,b,c;
freopen("in.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]+=c;
}
printf("%d\n",dinic());
}
return 0;
}