题干:
Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。
Input 本题包含若干组测试数据。
Output 对于每组测试数据,输出最小需要的代价。
Sample Input 2 1 1 2 1 3 3 1 2 5 1 2 4 2 3 3
Sample Output 1 3
Source 2017"百度之星"程序设计大赛 - 资格赛
|
题目大意:
求全局最小割
解题报告:
求全局最小割
AC代码:
using namespace std;
typedef pair<int,int> PII;
const int MAX = 3e3 + 5;
const int INF = 0x3f3f3f3f;
int G[MAX][MAX];
int dis[MAX],id[MAX];
bool vis[MAX];
int n,m;
int SW(int n) {
int res = INF;
for(int i = 0; i<n; i++) id[i]=i;
while(n>1) {
memset(dis,0,sizeof dis);
int k = 0;
for(int i = 1; i<n; i++) {
swap(id[k],id[i-1]);
for(int j = k = i; j<n; j++) {
dis[id[j]] += G[id[i-1]][id[j]];
if(dis[id[j]] > dis[id[k]]) k = j;
}
}
res = min(res,dis[id[k]]);
int s = id[n-2],t=id[n-1];
for(int i = 0; i<n-2; i++) {
int u = id[i];
G[u][s]=G[s][u]+=G[u][t];
}
id[k]=id[n--];
}
return res;
}
int main()
{
while(~scanf("%d%d",&n,&m)) {
for(int i = 0; i<=n; i++)
for(int j = 0; j<=n; j++)
G[i][j]=0;
for(int u,v,w,i = 1; i<=m; i++) {
scanf("%d%d%d",&u,&v,&w);
u--,v--;
G[u][v]+=w;
G[v][u]+=w;
}
printf("%d\n",SW(n));
}
return 0 ;
}