最小生成树

Prim

#include<bits/stdc++.h>
using namespace std;
struct edge
{
	int v,w,next;
}e[200005<<1];
int head[5005],dis[5005],cnt,n,m,tot,now=1,ans,inf=123456789;
bool vis[5005];
void add(int u,int v,int w)
{
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
int prim()
{
	for(int i=2;i<=n;i++)
	{
		dis[i]=inf;
	}
	for(int i=head[1];i!=0;i=e[i].next)
	{
		dis[e[i].v]=min(dis[e[i].v],e[i].w);
	}
    while(++tot<n)
    {
        int minn=inf;
        vis[now]=1;
        for(int i=1;i<=n;i++)
        {
            if(vis[i]==0&&minn>dis[i])
            {
                minn=dis[i];
				now=i;
            }
        }
        ans+=minn;
        for(int i=head[now];i;i=e[i].next)
        {
        	int v=e[i].v;
        	if(dis[v]>e[i].w&&!vis[v])
        	{
        		dis[v]=e[i].w;
        	}
		}
    }
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    	int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
		add(v,u,w);
    }
    printf("%d",prim());
    return 0;
}

Kruskal

#include<bits/stdc++.h>
using namespace std;
struct jade
{
    int x,y,v;
}e[200010];
int fa[5010],n,m,ans,cnt;
bool cmp(jade x,jade y)
{
    return x.v<y.v;
}
int find(int x)
{
    if(x==fa[x])
    {
        return x;
    }
    fa[x]=find(fa[x]);
    return fa[x];
}
void kru()
{
    sort(e+1,e+1+m,cmp);
    for(int i=1;i<=m;i++)
    {
        int fx=find(e[i].x);
        int fy=find(e[i].y);
        if(fx==fy)
        {
            continue;
        }
        ans+=e[i].v;
        fa[fy]=fx;
        cnt++;
        if(cnt==n-1)
        {
            break;
        }
    }
}
int main()
{

    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,v;
        cin>>x>>y>>v;
        e[i].x=x;
        e[i].y=y;
        e[i].v=v;
    }
    kru();
    if(cnt==n-1)
    {
        cout<<ans<<endl;
    }
    else
    {
        cout<<"orz"<<endl;
    }
    return 0;
}

原文

OVO%%dalao

posted @ 2025-05-17 17:51  BIxuan—玉寻  阅读(11)  评论(0)    收藏  举报