B - Networking -Prim

https://cn.vjudge.net/contest/242377#problem/B

 区别 生成树与最短路的 初始化问题

注意松弛操作的不同dis[j]>mmp[k][j]

不断用集合外最小的点去更新它所能连接的点



#include<iostream>
#include<cstring>
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
int n,m,ans,dis[maxn];
int mmp[maxn][maxn];
bool vis[maxn];
void prim()
{
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=n; i++)
        dis[i]=mmp[1][i];
    dis[1]=0;
    vis[0]=1;
    for(int i=0; i<n; i++)
    {
        int temp=inf ;
        int k=-1;
        for(int j=1; j<=n; j++)
            if(!vis[j]&&dis[j]<temp)
                temp=dis[k=j];
        if(k==-1||temp==inf)
            return ;
        ans+=dis[k];
        vis[k]=1;
        for(int j=1; j<=n; j++)
        {
            if(dis[j]>mmp[k][j]&&!vis[j])
                dis[j]=mmp[k][j];
        }
    }
}
int main()
{
    int u,v,w;
    while(cin>>n>>m)
    {
        if(n==0)
            break;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(i==j)mmp[i][j]=0;
                else
                    mmp[i][j]=inf;
        for(int i=0; i<m; i++)
        {
            cin>>u>>v>>w;
            if(w<mmp[u][v])
                mmp[u][v]=mmp[v][u]=w;
        }
        ans=0;
        prim();
        cout<<ans<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/81383336