poj 3469(最小割)
来源:互联网 发布:bt31破解软件最新版 编辑:程序博客网 时间:2024/05/09 06:11
有一些模块(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 longstruct 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;}
0 0
- poj 3469 最小割
- poj 3469 最小割
- POJ 3469 最小割
- POJ 3469 最小割
- poj 3469 最小割
- POJ 3469 最小割
- poj 3469(最小割)
- POJ 3469 (最小割)
- poj 3469(最小割)
- poj 3469(最小割)
- 【最小割】【poj 3469】 Language
- 3469poj(最小割)
- POJ 3469 Dual Core CPU //最小割
- poj 3469(最大流最小割)
- POJ 3469 构图最小割+链表SAP
- POJ 3469 最小割 最大流
- poj 3469 最大流 最小割
- POJ 3469 Dual Core CPU(最小割)
- 面试题91:清除矩阵0所在行列
- 关于国际化读取文件内容
- 世美堂后记
- PullToRefresh 使用详解
- JavaScript学习--Item37 面向对象高级程序设计
- poj 3469(最小割)
- 为PHP开发C语言扩展
- 242. Valid Anagram
- Mybatis使用“<trim prefix="SET" suffixOverrides=",">”出现Cause: java.sql.SQLException:
- 第14周项目3:数组类模板
- 【记录】Tom猫——用Animation-list逐帧动画实现
- 多线程学习(十)并发协作-死锁
- spring @ResponseBody ajax返回的result乱码问题
- 薄荷Toolbar(ActionBar)的适配方案