Prim算法求最大权,POJ(2485)

题目链接:http://poj.org/problem?id=2485

解题报告:

这里有一点要注意的是,第一个点时,dis数组还没有初始化,还全部为inf。第一次来到更新权时,才把邻接矩阵的数据存到dis中。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <algorithm>

using namespace std;

#define N 10005
#define inf 100010

int a[N][N],ans;

bool vis[N];
int dis[N],n;

bool Prim()
{
    ///初始化每条路没走过
    memset(vis,0,sizeof(vis));
    
    ///初始化到每一点的权
    for(int i=1; i<=n; i++)
    {
        dis[i]=inf;
    }

    ans=0;
    
    ///从第一个点搜起。到达自己的权为0
    dis[1]=0;

    ///搜索每个节点,加入到集合中来
    for(int i=1; i<=n; i++)
    {
        int tmp=inf,k=0;

        ///搜索每个点,找i到达下一点的最小权
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]<tmp)
            {
                tmp=dis[j];
                k=j;
            }
        }
        
        if(tmp==inf)        ///搜索不成功
        {
            return false;
        }

        vis[k]=true;        ///标记走过
       
        ans=max(ans,dis[k]);
        
        ///更新到每个节点的最小权
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]>a[k][j])
            {
                dis[j]=a[k][j];
            }
        }
    }
}

int main()
{
    int Case;
    scanf("%d",&Case);
    while(Case--)
    {
        scanf("%d",&n);
        ans=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        Prim();
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5385028.html