您的位置:首页 > 其它

Hdu Flow Problem

2013-04-18 23:03 232 查看
View Code

#include <iostream>
#include<cstdio>//最大流SAP
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define min(a,b) ((a)<(b))?(a):(b)
#define max(a,b) ((a)>(b))?(a):(b)
#define MAXN 200
#define MAXM 10000+10//M取N的平方倍
#define INF 0x3f3f3f3f
//链式前向星
struct enode
{
int t;
int w;                //权值
int c;                //流量
//  int cost;
//    int pre;            //前向指针
int next;
};
struct lstar
{
struct enode e[MAXM];
int box[MAXN],ecnt;
//int etail[MAXN];        //尾部
void init()
{
ecnt=0;
memset(box,-1,sizeof(box));
//    memset(etail,-1,sizeof(etail));        //初始化尾部
}
void addedge(int f,int t,int c)            //流量重载
{
e[ecnt].next=box[f];
e[ecnt].t=t;
e[ecnt].c=c;
box[f]=ecnt++;
e[ecnt].next=box[t];
e[ecnt].t=f;
e[ecnt].c=0;
box[t]=ecnt++;
}
};

int sap(int s,int t,lstar G,int N)//最大流问题
{
int gap[MAXN],lvl[MAXN],cur[MAXN],pre[MAXN];
int curflow,ans=0,u,tmp,neck,i;
memset(lvl,0,sizeof(lvl));
memset(gap,0,sizeof(gap));
memset(pre,-1,sizeof(pre));
for(i=0;i<N;i++)
cur[i]=G.box[i];
gap[0]=N;
u=s;
while(lvl[s]<N)
{
if(u==t)
{
curflow=INF;
for(i=s;i!=t;i=G.e[cur[i]].t)
{
if(curflow>G.e[cur[i]].c)
{
neck=i;
curflow=G.e[cur[i]].c;
}
}
for(i=s;i!=t;i=G.e[cur[i]].t)
{
tmp=cur[i];
G.e[tmp].c-=curflow;
G.e[tmp^1].c+=curflow;
}
ans+=curflow;
u=neck;
}
for(i=cur[u];i!=-1;i=G.e[i].next)
if(G.e[i].c && lvl[u]==lvl[G.e[i].t]+1)
break;
if(i!=-1)
{
cur[u]=i;
pre[G.e[i].t]=u;
u=G.e[i].t;
}
else
{
if(--gap[lvl[u]]==0)
break;
cur[u]=G.box[u];
for(tmp=N,i=G.box[u];i!=-1;i=G.e[i].next)
if(G.e[i].c)
tmp=min(tmp,lvl[G.e[i].t]);
lvl[u]=tmp+1;
gap[lvl[u]]++;
if(u!=s)
u=pre[u];
}
}
return ans;
}
int main()
{
int m,n,t;
lstar  s;
scanf("%d",&t);
int ct=1;
while(t--)
{
int a,b,cost;
cin>>n>>m;
// memset(map,0,sizeof(map));
s.init();
for(int i=0;i<m;i++)
{
cin>>a>>b>>cost;
s.addedge(a-1,b-1,cost);
}//参数含义:源点 汇点 网络结点数量
//printf("####\n");
/*  for(int i=1;i<=n;i++)
{
for(int k=s.box[i];k!=-1;k=s.e[k].next)
cout<<i<< " " <<s.e[k].t<< " " <<s.e[k].c<<endl;
}//*/
cout<<"Case "<<ct++<<":";
cout<<" "<<sap(0,n-1,s,n)<<endl;//最大流问题
}
return 0;
}
/*

2
3 2
1 2 1
2 3 1
3 3
1 2 1
2 3 1
1 3 1

Case 1: 1
Case 2: 2

*/

http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1002&ojid=0&cid=4456&hide=0
直接求最大流问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: