poj-2914 最小割stoer算法

来源:互联网 发布:简单图表制作软件 编辑:程序博客网 时间:2024/05/19 13:58

这题说是模板题,用stoer算法可以过,关于这个算法,网上很多雷同的讲解,自己就没必要再贴一份了(搞不清谁是原著)

贴一个模板吧(提交是8000多ms,看牛人将可以达到500多ms,求牛人指点啊)

#include<cstdio>#include<iostream>#include<cstring>#define INF 1000000000using namespace std;const int N=505;int graph[N][N];int rec[N],v[N],w[N];int S,T,cost,n;inline void prim(){memset(w,0,sizeof(w));memset(v,0,sizeof(v)); S=T=-1;int i,k,Max;while(1){ Max=-INF,k=-1;for(i=0;i<n;i++){if(!rec[i]&&!v[i]&&w[i]>Max){Max=w[i];k=i;}}if(k==-1) return;v[k]=1;cost=Max;S=T,T=k;for(i=0;i<n;i++){if(!rec[i]&&!v[i]){w[i]+=graph[k][i];}}}}int stoer(){memset(rec,0,sizeof(rec));int mincut=INF;for(int i=0;i<n-1;i++){prim();rec[T]=1;if(cost<mincut) mincut=cost;if(mincut==0) return 0;for(int j=0;j<n;j++){if(!rec[j]){graph[S][j]+=graph[T][j];graph[j][S]+=graph[j][T];}}}return mincut;}int main(){int s,t,k,m;while(scanf("%d %d",&n,&m)!=EOF){ memset(graph,0,sizeof(graph)); while(m--){scanf("%d %d %d",&s,&t,&k);graph[s][t]+=k;graph[t][s]+=k; } printf("%d\n",stoer());}return 0;}



原创粉丝点击