您的位置:首页 > 其它

POJ 2914 Minimum Cut (stoer_wagner算法)

2012-08-18 10:56 302 查看
题意:求最小割集

参考别人的。http://blog.csdn.net/vsooda/article/details/7397449 这里有stoer_wagner算法的说明。。

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <queue>

using namespace std;

const int N = 509;

const int INF = 0x3f3f3f3f;

int n,m;

int map

;

bool combine
;

bool visit
;

int dis
;

void oor(int f,int t)

{

for(int i=0;i<n;i++)

if(!combine[i])

{

map[f][i]+=map[t][i];

map[i][f]+=map[i][t];

}

}

int sear()

{

memset(visit,false,sizeof(visit));

memset(dis,0,sizeof(dis));

int maxdis,maxone,ans,f,t;

while(1)

{

maxdis =-INF;

for(int i=0;i<n;i++)

if(!combine[i]&&!visit[i]&&maxdis<dis[i])

{

maxdis = dis[i];maxone = i;

}

if(maxdis==-INF)

{

combine[t] = 1;

oor(f,t);

return ans;

}

visit[maxone] = true;

f = t; t = maxone;

ans = maxdis;

for(int i=0;i<n;i++)

if(!combine[i]&&!visit[i])

dis[i]+=map[maxone][i];

}

}

void solve()

{

int ans = INF;

memset(combine,false,sizeof(combine));

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

{

ans = min(ans,sear());

}printf("%d\n",ans);

}

int main()

{

freopen("in.txt","r",stdin);

while(~scanf("%d%d",&n,&m))

{

memset(map,0,sizeof(map));

int f,t,a;

while(m--)

{

scanf("%d%d%d",&f,&t,&a);

map[f][t]+=a;

map[t][f]+=a;

}

solve();

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: