poj 3469 dinic網路流模板

2021-07-04 03:39:25 字數 2630 閱讀 4171

題意:

要在由核a和核b組成的雙核cpu上執行n個模組。模組i在核a上執行的花費為ai,在核b上執行的花費為bi。

有m個相互之間需要進行資料交換的模組組合(ai, bi),如果這倆模組在同一核上執行則沒有花費。

否則會產生wi的花費。

計算執行所有模組所需的最小花費。

解析:用最小的費用將物件花費成兩個集合的問題,常常可以轉化成最小割後順利解決。p237

如果可以通過合適的建邊使得花費的總和等價於割的容量的話,為了求最小花費只需要求最小割就好了,也就是求最大流就好了。

分析簡直經典。

源點和匯點分別用來表示核a和核b。

然後,將核a與模組i相連,邊的容量代表花費;

同理,將模組i與核b相連,邊的容量代表花費;

然後模組之間有關係的相連,無向的。

求乙個最大流最小割就好了。

然後是原來的dinic的模板不支援1e5以上的點的資料,昨天直接把電腦跑熄火了。

換了一種。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int maxn = 20000 + 10;

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const double pi = acos(-1.0);

const double ee = exp(1.0);

struct edge

edge(int _fr, int _to, int _cap, int _flow)

};int s, t;

vectoredges;

vectorg[maxn];

bool vis[maxn];

int d[maxn];

int cur[maxn];

void init(int n)

edges.clear();

}void addedge(int fr, int to, int cap)

bool bfs()}}

return vis[t];

}int dfs(int x, int a)

}return flow;

}int dinic()

return flow;

}int main()

for (int i = 1; i <= m; i++)

printf("%d\n", dinic());

}return 0;

}

原來的:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int maxn = 1000 + 10;///邊不能太大,否則mle

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const double pi = acos(-1.0);

const double ee = exp(1.0);

int flow[maxn][maxn];

int cap[maxn][maxn];

int lev[maxn];

int a[maxn];

void addedge(int fr, int to, int c)

//bfs找層次網路,一次尋找多條增廣路徑

//st最小頂點編號,ed最大頂點編號,s源點,t匯點

bool bfs(int st, int ed, int s, int t)}}

}return lev[t] < inf;

}//利用層次網路進行增廣,每次dfs尋找的是從該點出發進行dfs增加的總量

//a表示從源點到該節點可增廣流量

int dfs(int v, int st, int ed, int s, int t)

}if (res == 0)

return res;

}int dinic(int st, int ed, int s, int t)

return res;

}int main()

// cout << "ss" << endl;

for (int i = 1; i <= m; i++)

// printf("%d\n", dinic(s, t, s, t));

}return 0;

}

No 24 POJ3469 鄰接表網路流

經典網路流模版題 首先,求最小割就是求最大流。稀疏圖,採用陣列模擬二維動態鍊錶。小 tr ic k red 小trick 在會產生回邊的地方,直接加入雙向邊,互相索引,提高dfs速度 大 tr ic k red 大trick stdio.h 比 cstdio 快一倍 shelldawn poj346...

網路流dinic演算法

遇到過不少網路流的題目,直接找增廣路徑的方法時間複雜度實在受不了。常面臨tle的問題。通過學習這個dinic演算法,不僅 短,效率也高。該演算法的重點在於乙個層次圖,是在普通增廣的方法上加了優化,普通的增廣是每次在圖上四處遊蕩,直到找到匯點為止。dinic演算法就是把每個點都給乙個等級level l...

模板 網路流 Dinic

const int maxn 207,inf 0x3f3f3f3f int n,m n個點,m條邊 int mp maxn maxn 鄰接矩陣 int que maxn maxn head,tail bfs佇列 首,尾 int dist maxn 距源點距離,分層圖 int ans bfs查詢是否連...