最小生成树(Prim)

来源:互联网 发布:seo黑帽技术教程 编辑:程序博客网 时间:2024/05/18 08:39
#include<iostream>using namespace std;#define INFINITE 9999;int e[100][100];int main(){    int i,j,k,w;//得到图(邻接矩阵)    int n,m;    int sum=0;    int cnt=0;    int mins=INFINITE;    int min_index;    int dis[100],book[100]={};    cin >> n >> m;    for(i=1;i<=n;i++){        dis[i]=INFINITE;        for(j=1;j<=n;j++)        {            if(i==j)                e[i][j]=0;            else                e[i][j]=INFINITE;        }    }    for(i=1;i<=m;i++){        cin >> j >> k >> w;        e[j][k]=e[k][j]=w;    }    book[1]=1;cnt++;//把1号顶点放入dis数组中,更新数组(距离),    for(i=2;i<=n;i++){        if(dis[i]>e[1][i])            dis[i]=e[1][i];    }    while(cnt<n){//重复n次,每次放入前sum+dis【】距离         for(i=1;i<=n;i++){            if(book[i]==0){                if(dis[i]<mins ){                    mins=dis[i];                    min_index=i;                }            }        }        book[min_index]=1;sum+=dis[min_index];cnt++;        mins=9999;        for(i=1;i<=n;i++){            if(book[i]==0&&dis[i]>e[min_index][i])                dis[i]=e[min_index][i];        }        cout << "dis " ;        for(i=1;i<=n;i++)            cout << dis[i] <<' ' ;        cout << endl;    }    cout << sum;    return 0;}