社区讨论

救救孩子

P2121拆地毯参与者 8已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi7pwz7f
此快照首次捕获于
2025/11/21 01:41
4 个月前
此快照最后确认于
2025/11/21 01:55
4 个月前
查看原帖
CPP
#include <stdio.h>
struct edge
{
    int u;
    int v;
    int w;
};
#define N 110000
struct edge e[N];
int n,m,k;
int f[N],sum=0,count=0;
void qsort(int l,int r)
{
    int i,j;
    struct edge t;
    if(l>r)
        return;
    i=l;j=r;
    while(i!=j)
    {
        while(e[j].w>=e[l].w&&i<j) j--;
        while(e[i].w<=e[l].w&&i<j) i++;
        if(i<j)
        {
            t=e[i];
            e[i]=e[j];
            e[j]=t;
        }
    }
    t=e[l];
    e[l]=e[i];
    e[i]=t;
    qsort(l,i-1);
    qsort(i+1,r);
}
int getf(int v)
{
    if(f[v]==v)
        return v;
    else
    {
        f[v]=getf(f[v]);
        return f[v];
    }
}
int merge(int v,int u)
{
    int t1,t2;
    t1=getf(v);
    t2=getf(u);
    if(t1!=t2)
    {
        f[t2]=t1;
        return 1;
    }
    return 0;
}
int main()
{
    int i;
    scanf("%d %d %d",&n,&m,&k);
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
    qsort(1,m);
    for(i=1;i<=n;i++)
        f[i]=i;
    for(i=m;i>=1;i--)
    {
        if(merge(e[i].u,e[i].v))
        {
            count++;
            sum=sum+e[i].w;
        }
        if(merge(e[i].v,e[i].u))
        {
            count++;
            sum=sum+e[i].w;
        }
        if(count==k-1)
            break;
    }
    printf("%d\n",sum);
}

回复

13 条回复,欢迎继续交流。

正在加载回复...