欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

prim 算法

程序员文章站 2022-06-04 10:49:23
...
prim算法就是从一个点开始,这个点访问过了就标记一下,然后从这个点出发找出跟他连接的最近的一个点,再将那个点放入数组中,
#include <iostream>

using namespace std;

int map[100][100];
int n;
int tree[100]={0};//表示最小生成树的数组
int v[100]={0};//对每个点有个相应的距离(权值)
int visited[100]={0};//判断是否访问
int cont;
int sum=0;//距离和
void prim()
{
    tree[cont]=1;
    visited[cont]=1;
    for(int i=1;i<=n;i++)
    {
        if(map[1][i]==-1)
            continue;
        v[i]=map[1][i];
        //cout<<i<<"&"<<endl;
    }

    cont++;
    //cout<<v[2]<<endl;//对第一个点的操作
    for(int i=2;i<=n;i++)//遍历每个最近的点
    {
        int num;
        int MAX=1000000;
        for(int j=1;j<=n;j++)
        {
            if(visited[j]==1)//首先,那个点要没有访问
                continue;
            if(v[j]<MAX)//找距离最近的点
            {
                MAX=v[j];
                num=j;
            }
        }
        sum+=v[num];
        //cout<<num<<"@"<<endl;
        visited[num]=1;//这个点访问了
        tree[cont]=num;//最小生成树数组更新
        cont++;
        for(int j=1;j<=n;j++)//更新所有与目前这个树的距离
        {
            if(visited[j]==1)
                continue;
            if(map[num][j]<v[j]&&map[num][j]!=-1)
            {
                v[j]=map[num][j];
                //cout<<"!"<<j<<endl;
            }

        }
        //cout<<endl;
        //cout<<v[2]<<endl;
    }
}
int main()
{

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>map[i][j];
        }
    }//读取地图
    for(int i=1;i<100;i++)
    {
        v[i]=100000;
    }
    cont=1;
    prim();
    for(int i=1;i<=n;i++)
    {
        cout<<tree[i]<<endl;
    }

    cout<<sum<<endl;
    return 0;
}
prim 算法