题意:求最小割集
参考别人的。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[N][N];
bool combine[N];
bool visit[N];
int dis[N];
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;
}
本文介绍了一种求解最小割问题的有效算法——Stoer-Wagner算法,并提供了详细的C++实现代码。该算法通过不断合并顶点来逐步减少图中的顶点数,最终找到最小割集。
&spm=1001.2101.3001.5002&articleId=7880224&d=1&t=3&u=5cf3b1caf8ca47b7ae297200f7df285d)
899

被折叠的 条评论
为什么被折叠?



