3 条题解

  • 1

    杜绝抄袭,仅供参考
    这是我凭借敏锐的眼力和灵活的手指写出的代码,盗窃别人劳动成果是不好的行为

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=6010;
    int T;
    int n,m;
    int f[N];
    int ans;
    int cnt[N];
    struct Edge
    {
        int u,v,w;
    }edge[N];
    bool cmp(Edge a,Edge b)
    {
        return a.w<b.w;
    }
    int find(int x)
    {
        if(x!=f[x])
            f[x]=find(f[x]);
        return f[x];
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>T;
        while(T--)
        {
            cin>>n;
            for(int i=1;i<n;i++)
            {
                int u,v,w;
                cin>>u>>v>>w;
                edge[i]={u,v,w};
            }
            sort(edge+1,edge+n,cmp);
            for(int i=1;i<=n;i++)
                f[i]=i,cnt[i]=1;
            ans=0;
            for(int i=1;i<n;i++)
            {
                int a=edge[i].u,b=edge[i].v;
                int x=find(a),y=find(b);
                if(x!=y)
                {
                    ans+=(edge[i].w+1)*(cnt[y]*cnt[x]-1);
                    f[x]=y;
                    cnt[y]+=cnt[x];
                }
            }   
            cout<<ans<<endl;
        }
        return 0;
    }
    
  • 0
    @ 2021-10-25 21:08:30

    这题最小生成树
    蓝书上有

  • -1
    @ 2023-10-30 19:38:52

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #define N 10010
    using namespace std;
    int s[N],fa[N];
    struct node{
    int x,y,val;
    }g[N];
    bool operator<(node a,node b){
    return a.val<b.val;
    }
    int get(int x)
    {
    if(fa[x]==x) return x;
    return fa[x]=get(fa[x]);
    }
    int main()
    {
    int t;
    cin>>t;
    while(t--)
    {
    memset(s,0,sizeof(s));
    memset(fa,0,sizeof(fa));
    int n;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].val);
    for(int i=1;i<=n;i++) fa[i]=i,s[i]=1;
    sort(g+1,g+n);
    int ans=0;
    for(int i=1;i<n;i++){
    int x=get(g[i].x),y=get(g[i].y),val=g[i].val;
    if(x==y) continue;
    fa[x]=y;
    ans+=(long long)(val+1)*(s[x]*s[y]-1);
    s[y]+=s[x];
    }
    cout<<ans<<endl;
    }
    return 0;
    }

  • 1

信息

ID
1023
难度
7
分类
(无)
标签
递交数
13
已通过
9
通过率
69%
被复制
3
上传者