poj 3469 Dual Core CPU 最小割
生活随笔
收集整理的這篇文章主要介紹了
poj 3469 Dual Core CPU 最小割
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
構(gòu)圖思路:
1. 源點(diǎn)S與頂點(diǎn)v連邊,容量為A
2. 頂點(diǎn)v與匯點(diǎn)T連邊,容量為B
3. 邊(a,b,c),則頂點(diǎn)a與頂點(diǎn)b連雙向邊,容量為c
則最小花費(fèi)為該圖最小割即最大流。
?
若兩個作業(yè)分別在不同機(jī)器運(yùn)行,則之間若有邊,則必定是滿流,否則必定還有增廣路。
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std;const int inf = 0x3f3f3f3f; const int MAXN = (int)2e5+10; int n, m; int S, T, N; int head[MAXN], idx; struct Edge{int v, f, nxt; }edge[MAXN<<3];void AddEdge(int u,int v,int f){edge[idx].v = v, edge[idx].f = f;edge[idx].nxt = head[u], head[u] = idx++;edge[idx].v = u, edge[idx].f = 0;edge[idx].nxt = head[v], head[v] = idx++; }int vh[MAXN], h[MAXN]; int dfs(int u,int flow){if(u == T) return flow;int tmp = h[u]+1, sum = flow;for(int i = head[u]; ~i; i = edge[i].nxt ){if( edge[i].f && (h[edge[i].v]+1 == h[u]) ){int p = dfs( edge[i].v, min(sum,edge[i].f));edge[i].f -= p, edge[i^1].f += p, sum -= p;if( sum == 0 || h[S] == N ) return flow - sum;}}for(int i = head[u]; ~i; i = edge[i].nxt )if( edge[i].f ) tmp = min( tmp, h[ edge[i].v ] );if( --vh[ h[u] ] == 0 ) h[S] = N;else ++vh[ h[u]=tmp+1 ];return flow-sum; } int sap(){int maxflow = 0;memset(h,0,sizeof(h));memset(vh,0,sizeof(vh));vh[0] = N;while( h[S]<N ) maxflow += dfs(S,inf);return maxflow; }int main(){while( scanf("%d%d",&n,&m) != EOF ){memset(head,-1,sizeof(head));S = 0, T = n+1, N = n+2; idx = 0;for(int i = 1; i <= n; i++){int a, b;scanf("%d%d",&a,&b);AddEdge( S, i, a );AddEdge( i, T, b );}for(int i = 0; i < m; i++){int a, b, c;scanf("%d%d%d",&a,&b,&c);AddEdge( a, b, c );AddEdge( b, a, c );}int ans = sap();printf("%d\n", ans );}return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/yefeng1627/p/3176263.html
總結(jié)
以上是生活随笔為你收集整理的poj 3469 Dual Core CPU 最小割的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连续两天暴跌,美债风暴要来了?
- 下一篇: poj 1737男人八题之一 orz