【最小生成树】kruskal模板 prim模板

混江龙づ霸主 提交于 2020-03-04 22:08:03

kruskal

#include <bits/stdc++.h>
using namespace std;
const int maxx=0x3f3f3f3f;
const int maxn=10000;
struct node
{
    int u,v,l;
    bool operator <(const node &a)const
    {
        return l<a.l;
    }
}edge[maxn];
int father[maxn];
int nodenum,edgenum;
void init()
{
    for(int i=0;i<nodenum;i++)
    {
        father[i]=i;
    }
}
int Find(int x)
{
    if(x==father[x])return x;
    return father[x]=Find(father[x]);
}
void Union(int x,int y)
{
    int temp_x=Find(x);
    int temp_y=Find(y);
    if(temp_x!=temp_y)
    {
        father[temp_x]=temp_y;
    }
}
int kruskal()
{
    sort(edge,edge+edgenum);
    init();
    node now;
    int ans=0;
    for(int i=0;i<edgenum;i++)
    {
        now=edge[i];
        if(Find(now.u)!=Find(now.v))
        {
            Union(now.u,now.v);
            ans+=now.l;
        }
    }
    return ans;
}
int main()
{
    while(scanf("%d %d",&edgenum,&nodenum)&&edgenum)
    {
        for(int i=0;i<edgenum;++i)
        {
            scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].l);
        }
        int ans=kruskal();
        bool flag=0;
        for(int i=2;i<=nodenum;i++)
        {
            if(Find(1)!=Find(i))
            {
                flag=1;
                break;
            }
        }
        if(flag)
        {
            cout<<"?"<<'\n';
        }
        else
        {
            cout<<ans<<'\n';
        }
    }
    return 0;
}

prim

#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
using namespace std;
int mp[150][150];
int dis[150];
int vis[150];
int nodenum,edgenum;
int prim(int src)
{
    for(int i=1; i<=nodenum; i++)
    {
        dis[i]=mp[src][i];
    }
    int sum=0;
    vis[src]=1;
    dis[src]=0;
    for(int i=2; i<=nodenum; i++)
    {
        int pos=-1;
        int MIN=INF;
        for(int j=1; j<=nodenum; j++)
        {
            if(dis[j]<MIN&&!vis[j])
            {
                pos=j;
                MIN=dis[j];
            }
        }
        if(pos==-1)
        {
            return -1;
        }
        sum+=MIN;
        vis[pos]=1;
        for(int j=1; j<=nodenum; j++)
        {
            if(!vis[j]&&dis[j]>mp[pos][j])
            {
                dis[j]=mp[pos][j];
            }
        }
    }
    return sum;
}
int main()
{
    int a,b,c;
    while(scanf("%d %d",&edgenum,&nodenum)&&edgenum)
    {
        memset(mp,INF,sizeof(mp));
        memset(dis,INF,sizeof(dis));
        memset(vis,0,sizeof(vis));
        for(int i=0; i<edgenum; i++)
        {
            scanf("%d %d %d",&a,&b,&c);
            mp[a][b]=min(mp[a][b],c);
            mp[b][a]=min(mp[a][b],c);
        }
        int ans=prim(1);
        if(ans==-1)
        {
            cout<<"?"<<'\n';
        }
        else
        {
            cout<<ans<<'\n';
        }
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!