poj2914——Minimum Cut//最小割Stoer_Wagner

来源:互联网 发布:win7万能网络驱动下载 编辑:程序博客网 时间:2024/06/04 20:02

题意:求最小割。

起初用最大流算法求最小割,但没有枚举汇点,结果WA。后来,搜了报告,才知道不能用最大流算法求,会TLE。

参考:Stoer_Wagner讲解    算法过程

#include <cmath>#include <cstdio>#include <memory.h>#include <algorithm>#include <iomanip>#include <iostream>#include <vector>#include <string>#include <queue>using namespace std;#define maxn 505int g[maxn][maxn];int n,m;int min(int a,int b){ if(a<b)  return a;return b;}void  in(){int a,b,c;memset(g,0,sizeof(g));while(m--){scanf("%d%d%d",&a,&b,&c);g[a+1][b+1]+=c;g[b+1][a+1]=g[a+1][b+1];}}int dist[maxn],vis[maxn],del[maxn];const int maxcost =1e10;int Stoer_Wagner()//求最小割{int i,j,k,pre,t;int mincut=maxcost;int s=1,tmp;memset(del,0,sizeof(del));for(t=1;t<n;t++){for(i=1;i<=n;i++)if(!del[i])dist[i]=g[s][i];memset(vis,0,sizeof(vis));vis[s]=1;k=s;for(i=1;i<=n-t;i++){tmp=-1e9;pre=k;k=0;for(j=1;j<=n;j++)//寻找最大dist[]{if(!del[j]&&!vis[j]&&dist[j]>tmp){k=j;tmp=dist[j];}}if(!k)  return 0;//不连通vis[k]=1;for(j=1;j<=n;j++)//将其加入 if(!del[j]&&!vis[j])dist[j]+=g[k][j];}mincut=min(mincut,dist[k]);//更新mincutdel[k]=1;for(i=1;i<=n;i++)if(!del[i]&&i!=pre){g[pre][i]+=g[k][i];g[i][pre]=g[pre][i];}}return mincut;}int main(){while(scanf("%d%d",&n,&m)!=EOF){in();cout<<Stoer_Wagner()<<endl;}     return 0;}