思路:用Kruskal 算出最小生成树的值,并记录每一条边,然后枚举去掉这些边 看其是否也能构成最小生成树且值相同。注意
在删边后,可能图构不成一棵树,得判断一下
//264K
16MS
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 10010
#define N 105
using namespace std;
struct E
{
u,v,w;
} edge[M];
int n,m,mst;
int parent[N];
bool flag;
bool cmp (E a,E b)
{
< b.w;
}
void Init ()
{
0; i < N; i ++)
parent[i] = i;
}
int find (int x) //查找是否属同一集合
{
parent[x])
parent[x] = find(parent[x]);
parent[x];
}
void Kruskal ()
{
i,j,u,v;
path[M];
0;
0;
true;
Init();
< n-1&&i
< m)
u = find (edge[i].u);
v = find (edge[i].v);
if (u != v)
{
parent[v] = u;
mst += edge[i].w;
path[j++] =
i;
//记录路径
}
i ++;
0; k < n-1; k
++)
int sum = 0;
j = 0,i = 0;
Init();
while (j < n - 1&&i
< m)
{
if (i == path[k])
{
i ++;
continue;
}