pku 2914

题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2914

这题差点就TLE。。。。8266MS A掉的,pku上面的神牛500多MS就过了,真是神牛呀,真不知道他们是怎么A过去的。。。

这题就是stoer_wagner算法,一开始想到用网络流枚举 Dinic,一直TLE,后来换了个算法stoer_wagner,还是TLE了,后来看了看,加了一行代码  if(t==a)  return ; 神奇般的AC了。。。。

 

stoer_wagner算法,有点像Prim算法.....具体可以参考:http://blog.csdn.net/yuhailin060/archive/2009/10/12/4659553.aspx

代码:

#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int MAX=505; const int INF=999999999; int map[MAX][MAX]; int visit[MAX]; int combine[MAX]; int w[MAX]; int n,m,s,t,min_cut; void maximum_adjacency_search() { memset(visit,0,sizeof(visit)); memset(w,0,sizeof(w)); s=t=-1; for(int k=0;k<n;k++) { int a,Max=-INF; for(int i=0;i<n;i++) if(!combine[i]&&!visit[i]&&w[i]>Max) { a=i,Max=w[i]; } if(t!=a) s=t,t=a; else return ; min_cut=w[t]; visit[a]=1; for(int i=0;i<n;i++) if(!combine[i]&&!visit[i]) w[i]+=map[a][i]; } } int stoer_wagner() { memset(combine,0,sizeof(combine)); int ans=INF; for(int i=0;i<n-1;i++) { maximum_adjacency_search(); if(min_cut<ans) ans=min_cut; combine[t]=1; for(int i=0;i<n;i++) if(!combine[i]) { map[i][s]+=map[i][t]; map[s][i]+=map[t][i]; } } return ans; } int main() { while(scanf("%d %d",&n,&m)!=EOF) { int x,y,v; memset(map,0,sizeof(map)); for(int i=0;i<m;i++) { scanf("%d %d %d",&x,&y,&v); map[y][x]+=v; map[x][y]+=v; } int temp=stoer_wagner(); printf("%d/n",temp); } return 0; }

你可能感兴趣的:(算法,网络,search,ini)