题干:
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代码:
#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 ;
}