首页 > 代码库 > 全局最小割模版 n^3
全局最小割模版 n^3
[cpp] view plaincopy
- //点标从0-n-1, 开始时先init 复杂度n^3
- //对于边(u,v,flow):
- //g[u][v]+=flow;
- //g[v][u]+=flow;
- typedef long long ll;
- const int N = 305;
- const ll inf = 1e18;
- ll g[N][N], w[N];
- int a[N], v[N], na[N];
- ll mincut(int n) {
- int i, j, pv, zj;
- ll best = inf;
- for(i = 0; i < n; i ++) v[i] = i;
- while(n > 1) {
- for(a[v[0]] = 1, i = 1; i < n; i ++) {
- a[v[i]] = 0;
- na[i-1] = i;
- w[i] = g[v[0]][v[i]];
- }
- for(pv = v[0], i = 1; i < n; i ++) {
- for(zj = -1, j = 1; j < n; j ++)
- if(!a[v[j]] && (zj < 0 || w[j] > w[zj])) zj = j;
- a[v[zj]] = 1;
- if(i == n-1) {
- if(best > w[zj]) best = w[zj];
- for(i = 0; i < n; i ++) {
- g[v[i]][pv] = g[pv][v[i]] += g[v[zj]][v[i]];
- }
- v[zj] = v[--n];
- break;
- }
- pv = v[zj];
- for(j = 1; j < n; j ++) if(!a[v[j]])
- w[j] += g[v[zj]][v[j]];
- }
- }
- return best;
- }
- void init(int n){
- for(int i = 0; i < n; i ++)
- for(int j = 0; j < n; j ++)
- g[i][j] = g[j][i] = 0;
- }
全局最小割模版 n^3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。