2

2021.8.25北中暑训

上午,讲了最小生成树

复习了一下最小生成树的算法

做了一点例题

prim做法

#include<bits/stdc++.h>
using namespace std;
int n,l[5001][5001],m,d[100001],minn,i,j,z,x,y,c,k,sl;
int main()
{
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        if(c<l[x][y]||l[x][y]==0)
        {
            l[x][y]=c;
            l[y][x]=c;
        }
    }
    memset(d,999999,sizeof(d));
    d[1]=0;
    for(i=2;i<=n;i++)
    {
        if(l[1][i]>0)
        {
            d[i]=l[1][i];
        }
    }
    for(i=1;i<n;i++)
    {
        minn=999999;
        k=0;
        for(j=1;j<=n;j++)
        {
            if(d[j]>0&&d[j]<minn)
            {
                minn=d[j];
                sl++;
                k=j;
            }
        }
        d[k]=0;
        z+=minn;
        for(j=1;j<=n;j++)
        {
            if(d[j]>0&&l[k][j]<d[j]&&l[k][j]>0)
            {
                d[j]=l[k][j];
            }
        }
    }
    if(sl<n-1)
    {
        printf("orz");
        return 0;
    }
    printf("%d",z);
    return 0;
}

克鲁斯卡尔做法

#include<bits/stdc++.h>
using namespace std;
struct node{
    int z,u,v;
}c[1000001];
int n,m,f[5001],jl,ans;
inline bool cmp(const node &x,const node &y)
{
    return x.z>y.z;
}
inline int gf(register int x)
{
    if(f[x]!=x)
    {
        return f[x]=gf(f[x]);
    }
    return x;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i)
    {
        f[i]=i;
    }
    for(register int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&c[i].u,&c[i].v,&c[i].z);
    }
    sort(c+1,c+m+1,cmp);
    while(jl<n-1&&m>0)
    {
        register int x,y;
        x=gf(c[m].u);
        y=gf(c[m].v);
        if(x!=y)
        {
            jl++;
            ans+=c[m].z;
            f[y]=x;
        }
        m--;
    }
    if(jl<n-1)
    {
        printf("orz");
        return 0;
    }
    printf("%d",ans);
    return 0;
}

下午,做了2015年普及组初赛题

做了提高组的题之后再做普及组的,确实感觉不一样哈

拿了90分,还不错吧

posted @ 2021-08-25 16:56  摩托鸭  阅读(35)  评论(0)    收藏  举报
Live2D