HDU 3691
2014-07-21 20:29
267 查看
一个源点,一个汇点,明显是网络流的问题,但据说用网络流来求最小割,会超时。。囧,那出题的人是怎么想的。。。
用SW的算法来求最小割。
View Code
用SW的算法来求最小割。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN=310; const int inf=100000000; int vis[MAXN],combine[MAXN],wan[MAXN]; int map[MAXN][MAXN]; int n,m,t; int mincut,S,T; void seacut(){ int Max; int p; S=T=-1; memset(vis,0,sizeof(vis)); memset(wan,0,sizeof(wan)); for(int i=0;i<n;i++){ Max=-inf; for(int j=0;j<n;j++){ if(!combine[j]&&!vis[j]&&wan[j]>Max){ Max=wan[j]; p=j; } } if(p==T) return; S=T;T=p; vis[T]=1; for(int j=0;j<n;j++){ if(!combine[j]&&!vis[j]){ wan[j]+=map[T][j]; } } } } void storewanger(){ mincut=inf; memset(combine,0,sizeof(combine)); for(int i=0;i<n-1;i++){ seacut(); if(wan[T]<mincut) mincut=wan[T]; if(mincut==0) return; combine[T]=1; for(int j=0;j<n;j++){ if(!combine[j]){ map[S][j]+=map[T][j]; map[j][S]+=map[j][T]; } } } } int main(){ int u,v,w; while(scanf("%d%d%d",&n,&m,&t)!=EOF){ if(!n&&!m&&!t) break; memset(map,0,sizeof(map)); for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&w); u--; v--; map[u][v]+=w; map[v][u]+=w; } storewanger(); printf("%d\n",mincut); } return 0; }
View Code
相关文章推荐
- HDU 3691 Nubulsa Expo(全局最小割)(10福州B题)#by zh
- Poj 3691 & Hdu 2457 DNA repair
- HDU 3691 Nubulsa Expo(全局最小割Stoer_Wagn)
- HDU 3691 Nubulsa Expo
- HDU 2457 || POJ 3691 DNA repair (AC自动机 + dp)
- POJ 3691 & HDU 2457 DNA repair (AC自动机,DP)
- hdu 3691 Nubulsa Expo
- Poj 3691 & Hdu 2457 DNA repair (AC自动机+DP)
- HDU 3691 Nubulsa Expo
- 【HDU 2457】 【POJ 3691】 DNA repair AC自动机+DP;
- HDU - 3691 Nubulsa Expo sw算法求全局最小割
- Hdu 3691 Nubulsa Expo(无向图最小割)
- HDU 3691 Nubulsa Expo (全局最小割)
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
- HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)
- HDU 3691 Nubulsa Expo(全局最小割)
- HDU 3691 全局最小割
- HDU 3691 Nubulsa Expo(SW算法求最小割)
- Stoer-Wagner算法训练题目合集 hdu 3691 hdu3002 poj 2914
- HDU-3691-全局最小割变形