求助,样例过了,输出比答案小,贪心思路为什么错了
查看原帖
求助,样例过了,输出比答案小,贪心思路为什么错了
307940
aaaaaaaawsl楼主2022/7/5 16:34

思路是先走二级公路,在选了的路上走最小的一级公路

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1e4 + 10;
const int M = 2e4 + 10;
int n, kk, m;
int fa[N], ans;
int road[N], rd[N], cnt, g;

struct node{
	int x, y, c1, tt;
}kru[M];

bool cmp(node a, node b){
	return a.c1 < b.c1;
}

struct Node{
	int idx, c2;
}k[M];

bool Cmp(Node a, Node b){
	return a.c2 < b.c2 ;
}

inline int get(int a){
	if(a == fa[a]) return a;
	else return fa[a] = get(fa[a]);
}

int main(){
	scanf("%d%d%d", &n, &kk, &m);
	for(int i = 1; i <= n ; ++ i){
		road[i] = 2;
	}
	for(int i = 1; i < m; ++ i){
		int a, b, c, cc;
		scanf("%d%d%d%d", &a, &b, &c, &cc);
		kru[i].x = a; kru[i].y = b; kru[i].c1 = c; kru[i].tt = i; k[i].c2 = cc; k[i].idx = i;
	}
	sort(kru + 1, kru + m, cmp);
	sort(k + 1, k + m , Cmp);
	
	for(int i = 1; i <= n; ++ i) fa[i] = i;
	for(int i = 1; i < n; ++ i){
		int x = get(kru[i].x);
		int y = get(kru[i].y);
		if(x == y) continue;
		rd[ ++ cnt] = kru[i].tt;
		fa[x] = y;
		ans = max(ans, kru[i].c1);
	}
	sort(rd + 1, rd + cnt + 1);
	for(int i = 1; i <= n; ++ i){
		if(rd[i]){
			ans = max(ans, k[i].c2);
			road[k[i].idx] = 1;
			g ++;
			if(g == kk) break;
		}
	}
	printf("%d\n", ans);
	for(int i = 1; i < n; ++ i){
		printf("%d %d\n", rd[i], road[rd[i]]);
	}
	return 0;
}
2022/7/5 16:34
加载中...