最小生成树 没定义 可以百度或者维基 先这么写着 还没写完

一共有三个 最后一个还没学

实际上相当于贪心 每次都找最小的且没选过的一个     

1.prim   是以点为中心选的边;

#include <iostream>

#include<string.h>

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define MAX 100
using namespace std;
int low[MAX],wath[MAX][MAX],bj[MAX],ll[MAX];
const int INF=0x3f3f3f3f;
int prim(int n)
{
    int a,b,c,i,j,k,min1,sum=0,p;
    memset(bj,0,sizeof(bj));
    memset(ll,0,sizeof(ll));
    memset(low,0x3f3f3f3f,sizeof(low));
    bj[1]=1;
    ll[1]=1;
    for(i=2;i<=n;i++)
    {
        if((wath[1][i]<low[i]&&wath[1][i]!=-1)&&(!bj[i]))
        {
            low[i]=wath[1][i];
        }
    }
    for(j=2;j<=n;j++)
    {
        min1=INF;
        p=-1;
        for(i=1;i<=n;i++)
            if(min1>low[i]&&(!bj[i]))
            {
                min1=low[i];
                p=i;
            }
        if(p==-1)
            return -1;
        sum+=low[p];
        for(i=1;i<=n;i++)
        {
            if((wath[p][i]<low[i]&&wath[p][i]!=-1)&&(!bj[i]))
            {
                low[i]=wath[p][i];
            }
        }
        bj[p]=1;
        ll[j]=p;
        printf("%d  %d   %d\n",ll[j-1],ll[j],min1);
    }
    return sum;
}
int main()
{
    int a,b,c,j,n,i,k,m;
    memset(wath,-1,sizeof(wath));
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        wath[a][b]=c;
        wath[b][a]=c;
    }
    printf("%d\n",prim(n));
    return 0;
}

2Kruskal;  相当于是以边为中心 通过把各个点连接起来来实现最后所有点都能相连才   需要用到并查集 来确定两点是否在一个集合内  

#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define MAX 100
#include<algorithm>
using namespace std;
struct qwe{
int a,b,lod;
}ll[MAX],wath[MAX];
int low[MAX],bj[MAX];
const int INF=0x3f3f3f3f;
int qwe1(int a)
{
    int b,c,i,j,k;
    i=b=a;
    while(bj[a]!=a)
    {
        a=bj[a];
    }
    while(i!=a)
    {
        j=bj[i];
        bj[i]=a;
        i=j;
    }
    return a;
}
void qwe2(int a,int b)
{
    int e,f;
    e=qwe1(a);
    f=qwe1(b);
    if(e!=f)
        if(e>f)
            bj[e]=f;
        else
            bj[f]=e;
}
int kruskal(int n,int m)
{
    int a,b,c,i,j,k,min1,sum=0,p;
    for(i=1;i<=n;i++)
        bj[i]=i;
    memset(ll,0,sizeof(ll));
    memset(low,0,sizeof(low));
    for(j=0;j<m;j++)
    {
       if(qwe1(wath[j].a)!=qwe1(wath[j].b))
        {
            qwe2(wath[j].a,wath[j].b);
            sum+=wath[j].lod;
            printf("%d %d %d\n",wath[j].a,wath[j].b,wath[j].lod);
        }
    }
    return sum;
}
bool cmp(struct qwe a,struct qwe b)
{
    return a.lod<b.lod;
}
int main()
{
    int a,b,c,j,n,i,k,m;


    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&wath[i].a,&wath[i].b,&wath[i].lod);
    }
    sort(wath,wath+m,cmp);
    for(i=0;i<m;i++)
        printf("%d  %d %d\n",wath[i].a,wath[i].b,wath[i].lod);
    printf("%d\n",kruskal(n,m));
    return 0;
}

3Borurm;   ....暂时还没学 敬请期待

猜你喜欢

转载自blog.csdn.net/qq_41886199/article/details/80572397