问题描述
一个无向图,顶点为N个,顶点编号为1~N,其中M条边已给定,现在要从K条备选边中选出若干条,使得整个图连通,且选出的边权值和最小。
输入
第一行输入三个整数N(N<100), M, K,接下来一行为K个整数表示备选边的编号。然后是是M行,每行三个数字:u,v,d(0<d<10000)表示结点u和结点v的边,权值为d,编号按照输入输入顺序依次为1~M。
输出
如果输入有解则输出选出的边的权值和否则输出-1
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100 + 10;
int s[maxn]; // 并查集 s[i] == i则i为根结点 s[i]==j表示结点i的父节点为j
struct E { // 边
int v, w; // 两个顶点
int p; // 边的权重
} es[maxn*(maxn-1)/2];
int ek[maxn*(maxn-1)/2]; // 备选边
bool cmp(E a, E b) {
return a.p < b.p;
}
int find(int x) { // 查找x的根结点
while(s[x] != x) { // 一直往上查找根节点
x = s[x];
}
return x;
}
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i=0; i<k; i++) {
scanf("%d", &ek[i]);
}
sort(ek, ek+k);
int v, w, p;
int j = 0;
for(int i=1;