比赛 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;
}