您的位置:首页 > 理论基础 > 计算机网络

POJ 1459 ZOJ 1734 Power Network dinic 算法 网络流

2013-04-09 15:43 330 查看
裸的网络流,就是在读数据的时候,注意用while(getchar()!='(');scanf("%d,%d),%d");

然后增加超源点与超收点。我是用dinic算法,速度慢,跑了549貌似ms,貌似,希望能优化,用个什么预流推进算法试试啊。

在纠结了很久后,终于在书上把预流推进算法抄下来了,哈哈,调试了很久,一直陷入死循环,后来一看输入文件不是这个题的输入,想shi啊,有木有

贴代码 dinic 算法 :

View Code

#include <cstdio>
#include <cstring>
#include <queue>
#define MAXN 110
#define INF 0x7fffffff  //相当于21,4748,3647
using namespace std;
int s,t; //源点和汇点
queue<int> act;
int h[MAXN];  //高度
int ef[MAXN]; //余流,能流出去多少
int n,np,nc,m;
int resi[MAXN][MAXN];//残留网络,每条边的权值表示容量
int min(int x,int y)
{
if(x <y)return x;
else return y;
}
void pushRelabel()
{
int i;
int sum=0;
int u,p;
memset(ef,0,sizeof(ef));
memset(h,0,sizeof(h));
h[s] = n+2;
ef[s] = INF;//源点能往外流正无穷
ef[t] = -INF;//汇点不能往外流,所以汇点能往外流负无穷
act.push(s);
while(!act.empty())
{
u = act.front();
act.pop();
for(i=0; i<=n+1; ++i)
{
p = min(resi[u][i],ef[u]);
if(p > 0 && (u==s || h[u] == h[i]+1))
{
resi[u][i] -= p;
resi[i][u] += p;
ef[u] -= p;
ef[i] += p;
if(i == t) sum += p;
if(i != s && i!=t)
act.push(i);
}
}
if(u != s && u != t && ef[u] > 0)
{
h[u]++;
act.push(u);
}
}
printf("%d\n",sum);
}
int main()
{
//    freopen("in.cpp","r",stdin);
int i;
int u,v,val;
while(~scanf("%d%d%d%d",&n,&np,&nc,&m))
{
s = n;
t = n+1;
memset(resi,0,sizeof(resi));
for(i=0; i<m; ++i)
{
while(getchar()!='(');
scanf("%d,%d)%d",&u,&v,&val);
resi[u][v] = val;
}
for(i=0; i<np; ++i)
{
while(getchar()!='(');
scanf("%d)%d",&u,&val);
resi[s][u] = val;
}
for(i=0; i<nc; ++i)
{
while(getchar()!='(');
scanf("%d)%d",&u,&val);
resi[u][t] = val;
}
pushRelabel();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: