Nubulsa Expo. 全局最小割
2017-10-15 22:43
148 查看
#include <bits/stdc++.h>
//点标从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
, w
;
int a
, v
, na
;
void add_edge(int u , int v , int flow){
g[u][v] += flow ;
g[v][u] += flow ;
}
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;
}
int main()
{
int n , m , st ;
while( ~ scanf("%d %d %d" , & n , & m , & st ))
{
if(!n && !n && !st) break ;
init(n) ;
int a , b , c;
for(int i = 0 ; i < m ; i ++ ){
scanf("%d %d %d" , &a , &b , &c) ;
add_edge(a - 1 , b - 1 , c) ;
}
printf("%lld\n" , mincut(n)) ;
}
return 0 ;
}
//点标从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
, w
;
int a
, v
, na
;
void add_edge(int u , int v , int flow){
g[u][v] += flow ;
g[v][u] += flow ;
}
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;
}
int main()
{
int n , m , st ;
while( ~ scanf("%d %d %d" , & n , & m , & st ))
{
if(!n && !n && !st) break ;
init(n) ;
int a , b , c;
for(int i = 0 ; i < m ; i ++ ){
scanf("%d %d %d" , &a , &b , &c) ;
add_edge(a - 1 , b - 1 , c) ;
}
printf("%lld\n" , mincut(n)) ;
}
return 0 ;
}
相关文章推荐
- poj 2914&&hdu 3002 全局最小割Stoer-Wagner算法模板
- POJ 3691 Nubulsa Expo 全局最小割
- poj 2914(stoer_wanger算法求全局最小割)
- 图的全局最小割的Stoer-Wagner算法及例题
- POJ2914 Minimum Cut【全局最小割】【Stoer-Wangner】
- POJ 2914 Minimum Cut 全局最小割
- poj2914(stoer-wagner算法求解全局最小割)
- SW板子 hdu3691(全局最小割 o(n^3)
- HDU 3002 King of Destruction(全局(无向图)最小割(SW))
- HDU 3691 Nubulsa Expo(全局最小割)(10福州B题)#by zh
- poj 2914&&hdu 3002 全局最小割Stoer-Wagner算法模板
- 全局最小割
- POJ2914 Minimum Cut 【全局最小割】(Stoer_Wagner)
- POJ 2914 Minimum Cut 全局最小割
- SW板子 hdu3691(全局最小割 o(n^3)
- HDU 3691 Nubulsa Expo(全局最小割)
- [全局最小割] BZOJ 3345
- Stoer-Wagner算法求全局最小割
- 【BZOJ3345】Minimum Cut 全局最小割 【Stoer_Wagner算法】
- 机器学习笔记(XVIII)神经网络(V)全局最小局部极小