码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-13 00:02:41      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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

解题报告:

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

using namespace std;

#define NUM 1000
const int maxint=10000000;

int c[NUM][NUM];        ///邻接矩阵

int ans=maxint;

int Prim(int n,int c[][NUM])
{
    int lowcost[NUM];       ///
    memset(lowcost,maxint,sizeof(lowcost));

    int closest[NUM];       ///节点

    int s[NUM]= {false};    ///标记

    ///初始化数组
    for(int i=1; i<=n; i++)
    {
        lowcost[i]=c[1][i];
        closest[i]=1;
        s[i]=false;

        ans=min(lowcost[i],ans);
    }

    ///从顶点v1开始
    s[1]=true;

    ///处理其余n-1个顶点
    for(int i=1; i<n; i++)
    {
        ///在未处理的节点中,找最小权的节点
        int min=maxint;
        int j=1;    ///节点
        for(int k=2; k<=n; k++)
        {
            if(lowcost[k]<min&&(!s[k]))
            {
                min=lowcost[k];
                j=k;
            }
        }

        ans=max(ans,min);
        //printf("%d %d\n",closest[j],j);

        ///加入节点到解集中
        s[j]=true;

        ///根据新的节点,更新数组lowcost,和,closest
        for(int k=2; k<=n; k++)
        {
            if((c[j][k]<lowcost[k])&&(!s[k]))
            {
                lowcost[k]=c[j][k];
                closest[k]=j;
            }
        }
    }
    return ans;
}


int main(void)
{
    int test;
    cin>>test;
    while(test--)
    {
        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                cin>>c[i][j];
                if(c[i][j]==0)
                    c[i][j]=maxint;
            }
        cout<<Prim(n,c)<<endl;
    }
    return 0;
}

 

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

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5385028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!