bzoj 1196: [HNOI2006]公路修建问题 (最小生成树)

来源:互联网 发布:csgo弹道优化参数 编辑:程序博客网 时间:2024/06/06 15:53

题目描述

传送门

题解

现将一级公路排序,选出最小的能在同一棵生成树中的K条边。然后再正常做最小生成树即可。

代码

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define N 500003using namespace std;struct data{  int x,y,v;}e[N],e1[N];int n,m,k,fa[N];int cmp(data a,data b){    return a.v<b.v;}int find(int x){    if (fa[x]==x) return x;    fa[x]=find(fa[x]);    return fa[x];}int main(){    freopen("a.in","r",stdin);    scanf("%d%d%d",&n,&k,&m); int M=0;    for (int i=1;i<=m;i++) {        int x,y,c1,c2;        scanf("%d%d%d%d",&x,&y,&c2,&c1);        e[i].x=x; e[i].y=y; e[i].v=c2;        e1[++M].x=x; e1[M].y=y; e1[M].v=c1;    //  e1[++M].x=x; e1[M].y=y; e1[M].v=c2;    }    sort(e+1,e+m+1,cmp);    sort(e1+1,e1+M+1,cmp);    for (int i=1;i<=n;i++) fa[i]=i;    int ans=0; int cnt=0;    for (int i=1;i<=m;i++) {        int r1=find(e[i].x); int r2=find(e[i].y);        if (r1!=r2) {            fa[r2]=r1;            ans=max(ans,e[i].v);            cnt++;        }        if (cnt==k) break;    }    for (int i=1;i<=M;i++) {        int r1=find(e1[i].x); int r2=find(e1[i].y);        if (r1!=r2) {            fa[r2]=r1;            ans=max(ans,e1[i].v);        }    }    printf("%d\n",ans);}
阅读全文
0 0