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

最小生成树prim()算法;

时间:2016-03-26 20:15:17      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

1.最小生成树是指连通所有点的路径之和最小;

2.prim算法是由一个点扩展到所有点,开始生成树中只有一个节点v,第一次扩展,将距离最小生成树最近的节点加入最小生成树,同时更新最小生成树到其他节点的最短路,以此类推,直到所有节点都加入最小生成树。

3.以poj2485为例,

题意:求最小生成树中的最大边长;

源码:

#include<iostream>
#include<stdio.h>
#define MAX 999999
using namespace std;
int mapp[510][510];
int check()
{
    int i,j,n;
    int maxx=0;
    bool v[600];
    int dist[600];
    cin>>n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            scanf("%d",&mapp[i][j]);
            if(mapp[i][j]==0) mapp[i][j]=MAX;
            }
    for(i=1;i<=600;i++) v[i]=false;
    //从第一个节点开始扩展
    v[1]=true;
    for (i=1;i<=n;i++){
        dist[i]=mapp[1][i];
    }
    //需要加入n-1个点
    for(i=1;i<=n-1;i++)
    {
        int mini=0,minn=MAX;
        for(j=1;j<=n;j++)
            if(!v[j]&&minn>dist[j])
        {
            minn=dist[j];
            mini=j;
        }
        if(maxx<minn) maxx=minn;
        v[mini]=true;
        for(j=1;j<=n;j++)
        if(!v[j]&&dist[j]>mapp[mini][j]){
            dist[j]=mapp[mini][j];
        }
    }
return maxx;
}
int main()
{
    int t,i;
    cin>>t;
    for (i=1;i<=t;i++)
    {
        cout<<check()<<endl;
    }
    return 0;
}

最小生成树prim()算法;

标签:

原文地址:http://www.cnblogs.com/dlut-li/p/5323701.html

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