| 比赛 |
26暑假集训模拟赛3 |
评测结果 |
AAAAAAAAAAAAATTTTTTA |
| 题目名称 |
城市建设 |
最终得分 |
70 |
| 用户昵称 |
zcx |
运行时间 |
35.822 s |
| 代码语言 |
C++ |
内存使用 |
4.28 MiB |
| 提交时间 |
2026-07-06 11:14:01 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e4 + 5;
const int M = 5e4 + 5;
struct edge{
int u,v,w,p;
} ed[M];
int n,m,q;
int fa[N],sz[N];
bool cmp(edge a,edge b){
return a.w < b.w;
}
void init(){ for(int i = 1;i <= n;i++) fa[i] = i,sz[i] = 1;}
int find(int x){ return x == fa[x]? x : fa[x] = find(fa[x]);}
void merge(int x,int y){
if(sz[x] < sz[y]) swap(x,y);
fa[y] = x;
sz[x] += sz[y];
}
signed main()
{
freopen("hnoi2010_city.in","r",stdin);
freopen("hnoi2010_city.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>q;
for(int i = 1;i <= m;i++) cin>>ed[i].u>>ed[i].v>>ed[i].w,ed[i].p = i;
sort(ed + 1,ed + 1 + m,cmp);
while(q--){
int k,d,flag;cin>>k>>d;
for(int i = 1;i <= m;i++){
if(ed[i].p == k){
if(d <= ed[i].w) flag = 1;
else flag = 2;
ed[i].w = d;
break;
}
}
if(flag == 1){for(int i = m;i > 1;i--) if(ed[i].w < ed[i - 1].w) swap(ed[i],ed[i - 1]);}
else for(int i = 1;i < m;i++) if(ed[i].w > ed[i + 1].w) swap(ed[i],ed[i + 1]);
init();
int ans = 0;
for(int i = 1;i <= m;i++){
int x = find(ed[i].u),y = find(ed[i].v);
if(x == y) continue;
ans += ed[i].w;
merge(x,y);
}
cout<<ans<<endl;
}
return 0;
}