题干:


Problem Description

度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。

哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。

所以这一场战争,将会十分艰难。

为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。

第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。

哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。

现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战争的顺利进行。

请问最少应该付出多少的代价。

 

Input

本题包含若干组测试数据。

第一行两个整数n,m,表示有n个将领,m个关系。

接下来m行,每行三个整数u,v,w。表示u将领和v将领之间存在一个强关系,摧毁这个强关系需要代价w

数据范围:

2<=n<=3000

1<=m<=100000

1<=u,v<=n

1<=w<=1000

 

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代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
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 ;
}