关于我打了一个纯模板然后84

P3366 【模板】最小生成树

hayoon @ 2023-11-23 13:58:56


#include<bits/stdc++.h>
using namespace std;
struct edge
{
    int u;
    int v;
    int w;
};
struct edge e[1000000];
int n,m;
int f[500010]={0},sum=0,count1=0;
void quicksort(int left,int right)
{
    int i,j;
    struct edge t;
    if(left>right)
    return;
    i=left;
    j=right;
    while(i!=j)
    {
        while(e[j].w>=e[left].w && i<j)
        j--;
        while(e[i].w<=e[left].w && i<j)
        i++;
        if(i<j)
        {
            t=e[i];
            e[i]=e[j];
            e[j]=t;
        }
    }
    t=e[left];
    e[left]=e[i];
    e[i]=t;
    quicksort(left,i-1);
    quicksort(i+1,right);
    return;
}
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",&n,&m);
    for(int i=1;i<=m;i++)
    scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    quicksort(1,m);
    for(int i=1;i<=n;i++)
    f[i]=i;
    for(int i=1;i<=m;i++)
    {
        if(merge(e[i].u,e[i].v))
        {
            count1++;
            sum+=e[i].w;
        }
        if(count1==n-1)
        break;
    }
    printf("%d",sum);
    return 0;
}

________________________________________________________________________________________________________________________

求大佬解释一下

by SSqwq_ @ 2023-11-23 14:03:07

@hayoon 读题。

如果该图不连通,则输出 orz

另外您为什么要手写快排啊/yun,STL 在关键字排序这方面一直可以的。


by hayoon @ 2023-11-23 14:04:42

额..... 谢谢大佬


by _Lyk_def @ 2023-11-23 14:05:11

没有判断不连通的情况,判断了就过了


by Fractured_Angel @ 2023-12-16 19:44:14

手写快排狠人


|