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

poj 3469(最小割)

2016-06-02 09:43 281 查看
有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销。现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要加上一个开销。现在需要完成所有模块,问最小需要多少开销。

如果没有这个额外的开销,那么每个模块只要选择开销小的那个核就行了。额外的开销给选择加上了限制。

先讲讲我的错误思路:拿A,B两台机器分别作为源点和汇点,然后将n个模块拆成两个,即x->x',这样就形成了A->x->x'->B的模型了,拆开的x和x'之间赋无穷大,A->x和x'->B赋相应的花费即可,额外的开销就是a->b'和b->a'赋值为w即可。最后跑最大流,结果WA。。参考了别人的思路,发现我的建图有问题,因为x->x'之间赋了无穷大,说明这条边是不起作用的,这条边可以“穿梭自如”,很有可能A->x和x'->B都会被我们选中,所以WA也是自然而然的了。

看了别人的建图,确实解决了这个问题,不需要拆点,直接就是A->x->B即可,再根据额外的开销a->b和b->a建边即可。

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 20010
#define maxm 1000000
#define LL long long
struct Eg{
int to;
int next;
int f;
}E[maxm];
int V[maxn],num;
int N,M;
void add(int u,int v,int c){
E[num].to=v;
E[num].f=c;
E[num].next=V[u];
V[u]=num++;

E[num].to=u;
E[num].f=0;
E[num].next=V[v];
V[v]=num++;
}
int level[maxn];
int qu[maxn];
bool BFS(int s,int t){
int i,iq=0;
for(i=0;i<=t;i++) level[i]=0;
int u,v,e;
qu[iq++]=s;
level[s]=1;
for(i=0;i<iq;i++){
u=qu[i];
if(u==t) return true;
for(e=V[u];e!=-1;e=E[e].next){
v=E[e].to;
if(!level[v]&&E[e].f>0)
{
level[v]=level[u]+1;
qu[iq++]=v;
}
}
}
return false;
}
int cur[maxn];
int dfs(int u,int maxf,int t){
if(u==t||maxf==0) return maxf;
int ret=0,f,e,v;
for(e=cur[u];e!=-1;e=E[e].next){// 当前弧优化
v=E[e].to;
if(E[e].f>0&&level[u]+1==level[v]){
f= dfs(v,min(maxf,E[e].f),t);
E[e].f-=f;
E[e^1].f+=f;
maxf-=f;
ret+=f;
cur[u]=e;
if(maxf==0) break;
}
}
return ret;
}
int Dinic(int s,int t){
int flow=0;
while(BFS(s,t)){
for(int i=0;i<=t;i++)
cur[i]=V[i];
flow+=dfs(s,MOD,t);
}
return flow;
}
int main(){
int i;
int a,b,w;
while(scanf("%d %d",&N,&M)!=EOF){
for(i=0;i<=N+1;i++)V[i]=-1;
num=0;
for(i=1;i<=N;i++){
scanf("%d %d",&a,&b);
add(0,i,a);
add(i,N+1,b);
}
while(M--){
scanf("%d %d %d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
}
printf("%d\n",Dinic(0,N+1));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络流