//这是一条裸最大流,ford-fulkerson算法
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 16;
int T;
int N,M;
int X,Y,C;
struct Matrix
{
int c,f;
};
Matrix Edge[MAXN][MAXN];
int s,t;
int residual[MAXN][MAXN];
int qu[MAXN*MAXN];
int qs,qe;
int pre[MAXN];
int vis[MAXN];
int maxflow,min_augment;
void find_augment_path()
{
int i,cu;
memset(vis,0,sizeof(vis));
memset(residual,0,sizeof(residual));
memset(pre,0,sizeof(pre));
//queue<int> qu;
//qu.push(s);
qs = 0;
qu[qs] = s;
pre[s] = s;
vis[s] = 1;
qe = 1;
while(qs < qe&& pre[t] == 0)
{
cu = qu[qs];
for(int i = 1; i <= N; i++)
{
if(vis[i] == 0)
{
if(Edge[cu][i].c - Edge[cu][i].f > 0)
{
residual[cu][i] = Edge[cu][i].c - Edge[cu][i].f;
pre[i] = cu;
//qu.push(i);
qu[qe++] = i;
vis[i] = 1;
}
else if(Edge[i][cu].f > 0)
{
residual[cu][i] = Edge[i][cu].f;
pre[i] = cu;
//qu.push(i);
qu[qe++] = i;
vis[i] = 1;
}
}
}
qs++;
}
}
void augment_flow()
{
int i = t,j;
if(pre[i] == 0)
{
min_augment = 0;
return;
}
j = 0x7fffffff;
while(i != s)
{
if(residual[pre[i]][i] < j)
{
j = residual[pre[i]][i];
}
i = pre[i];
}
min_augment = j;
}
void update_flow()
{
int i = t;
if(pre[i] == 0)
return;
while(i != s)
{
if(Edge[pre[i]][i].c - Edge[pre[i]][i].f > 0)
Edge[pre[i]][i].f += min_augment;
else if(Edge[i][pre[i]].f > 0)
Edge[i][pre[i]].f -= min_augment;
i = pre[i];
}
}
void Ford()
{
s = 1, t = N;
maxflow = 0;
while(1)
{
find_augment_path();
augment_flow();
maxflow += min_augment;
if(min_augment > 0)
update_flow();
else
return;
}
}
int main()
{
cin>>T;
for(int casei = 1; casei <= T; casei++ )
{
memset(Edge,0,sizeof(Edge));
cin>>N>>M;
for(int i = 0; i < M; i++)
{
cin>>X>>Y>>C;
Edge[X][Y].c += C;
}
Ford();
cout<<"Case "<<casei<<": "<<maxflow<<endl;
}
return 0;
}
hdu 3549 最大流
最新推荐文章于 2018-10-19 20:31:30 发布