比赛 26暑假集训模拟赛3 评测结果 AAAAAAAAAATTTTTTTTTW
题目名称 城市建设 最终得分 50
用户昵称 对立猫猫对立 运行时间 47.316 s
代码语言 C++ 内存使用 3.92 MiB
提交时间 2026-07-06 10:55:24
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n, m, q, k, d, ans;
bool choose[50005];
struct Edge {
	int id, x, y, w;
} e[50005];
bool cmp1(Edge &a,Edge &b) {
	return a.w < b.w;
}
bool cmp2(Edge &a,Edge &b) {
	return a.id < b.id;
}
int f[20005];
void init() {
	for(int i = 1; i <= n; i++) f[i] = i;
}
int get(int x) {
	if(x == f[x]) return x;
	return f[x] = get(f[x]);
}
void merge(int x,int y) {
	int fx = get(x),fy = get(y);
	if(fx != fy) f[fy] = fx;
}
void kruskal() {
	init();
	memset(choose, 0, sizeof choose);
	ans = 0;
	for(int i = 1;i <= m;i++) {
		int x = e[i].x, y = e[i].y, w = e[i].w;
		if(get(x) != get(y)) {
			merge(x, y);
			ans += w;
			choose[e[i].id] = 1;
		}
	}
}
int main() {
	freopen("hnoi2010_city.in","r",stdin);
	freopen("hnoi2010_city.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> q;
	for(int i = 1; i <= m; i++) {
		e[i].id = i;
		cin >> e[i].x >> e[i].y >> e[i].w;
	}
	sort(e + 1, e + m + 1, cmp1);
	kruskal();
	for(int i = 1; i <= q; i++) {
		cin >> k >> d;
		sort(e + 1, e + m + 1, cmp2);
		int last = e[k].w;
		e[k].w = d;
		if(last > d || choose[k]) {
			sort(e + 1, e + m + 1, cmp1);
			kruskal();
		}
		cout << ans << '\n';
	}
	return 0;
}