prim 求最小生成树(邻接矩阵)

#include 
#include 
#include 
using namespace std;
const int INF=0x3f3f3f3f;//无穷数
const int maxn=100;//最大城市数;
int guide[maxn][maxn];//邻接矩阵
int n,dis[maxn];//城市数  距当前树距离
bool vst[maxn]={false};//访问标记
int re=0;//最小花费
void prime(int x){
    memset(dis, INF, sizeof(dis));
    dis[x]=0;
    for(int i=1;i<=n;i++){//每循环一次加入一个,共n次
        int u=-1,min=INF;//新加入下标 最小花费
        for(int j=1;j<=n;j++){
            if(vst[j]==false&&dis[j]<=min){//小于等于更安全
                u=j;
                min=dis[j];
            }
        }
        vst[u]=true;
        re+=min;
        for(int j=1;j<=n;j++){
            int v=guide[u][j];
            if(vst[j]==false&&v//更新dis
                dis[j]=v;
            }
        }
    }
}
int main(){
    memset(guide, INF, sizeof(guide));
    cin>>n;int k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>k;
            if(k!=-1)guide[i][j]=k;
        }
    }
    prime(1);
    cout</*
6
-1  6   1   5   -1  -1
6   -1  5   -1  3   -1
1   5   -1  5   6   4
5   -1  5   -1  -1  2
-1  3   6   -1  -1  6
-1  -1  4   2   6   -1
*///re=15

你可能感兴趣的:(C/C++)