题意:求一个无向图中,k联通分量的个数。
迭代过程:
用Stoer_Wagner求出当前全局最小割,判断是否大于k,是就返回,不是就按割边把图分成两个部分继续迭代。
用Soter_Wagner按最小割把图分为两部分的方法:此算法一直把点合并,当合并到某一状态时,当前最小割被更新了,那么对于当前最小割 ,"prim"时最后加入的那个点及和他合并的点就是一部分,剩余的点就是另一部分,得到最小割时划分的两部分即可。
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N = 105;
const int inf = 1e8;
int g[N][N],a[N][N],p[N];
bool vis[N],combine[N],par[N];
int d[N],node[N],st[N],k,s,t;
vector<int> vst[N];
vector<int> pa,pb;
int prim(int n){
clr(vis,0);
clr(d,0);
int mincut = 0;
int tmp = -1;
s =-1, t =-1;
int top = 0;
for(int i=0;i<k;i&