prim算法求最小生成树


#include<iostream>

using namespace std;

const int N=110;
const int INF=0x3f3f3f3f;
int g[N][N],dist[N];
bool st[N];

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>g[i][j];
       
    memset(dist,0x3f,sizeof dist);
    int ans=0;
    for(int i=0;i<n;i++)    //每次回选到一个点
    {
        int t=-1;   //记录需扩展的点
        for(int j=1;j<=n;j++)   if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;   //在未选择的点内找到一个距已生成的树最近的点

        //标记该店已被扩展到树内
        st[t]=true;

        //若该点不能到达,则直接返回。
        // i 因为第一个点时,树还未生成,没有边长,所以第一个i点不执行下列语句
        if(i&&dist[t]==INF)
        {
            cout<<INF<<endl;
            return 0;
        }

        //同上,第一个点不进行添加
        if(i) ans+=dist[t];

        //更新其余点对于树的距离。
        //这里不进行判断点是否在树内,是因为即使在树内的点被更改了距离也无所谓,以后不会再用到
        for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
    }
    cout<<ans<<endl;
    return 0;
}
posted on 2023-03-04 20:51  rain_wind_read  阅读(24)  评论(0)    收藏  举报