题解 P4809 【[CCC 2018]最大战略储备】

· · 题解

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,p,q,a,b,c,fax[100010],fay[100010];
long long sum=0,ans=0;
struct E{
    int x,y,w,t;
}e[1000010];
int cmp(const E &a,const E &b) {
    return a.w<b.w;
}
int findx(int x) {
    if(x!=fax[x]) return fax[x]=findx(fax[x]);
    return fax[x];
}
int findy(int x) {
    if(x!=fay[x]) return fay[x]=findy(fay[x]);
    return fay[x];
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&q);

    for(int i=1;i<=m;i++) fax[i]=i;
    for(int j=1;j<=n;j++) fay[j]=j; 

    for(int i=1;i<=p;i++) {
        scanf("%d%d%d",&a,&b,&c);
        e[i]=(E){a,b,c,0};
        sum+=1ll*e[i].w*n;
    }

    for(int i=1;i<=q;i++) {
        scanf("%d%d%d",&a,&b,&c);
        e[i+p]=(E){a,b,c,1};
        sum+=1ll*e[i+p].w*m;
    }

    sort(e+1,e+1+p+q,cmp);

    for(int i=1;i<=p+q;i++) {
        if(e[i].t) {
            int U=findy(e[i].x),V=findy(e[i].y);
            if(U!=V) {
                fay[U]=V;
                ans+=1ll*m*e[i].w;
                n--;
            }
        }
        else {
            int U=findx(e[i].x),V=findx(e[i].y);
            if(U!=V) {
                fax[U]=V;
                ans+=1ll*n*e[i].w;
                m--;
            }
        }
    }
    printf("%lld\n",sum-ans);
    return 0;
}