无向图相关问题

问题描述
一个无向图,顶点为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;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值