首页 > 代码库 > HDOJ 1301 Jungle Roads
HDOJ 1301 Jungle Roads
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301
//HDOJ1301#include<iostream>
#include<cstring>using namespace std;#define MAX 99999#define LEN 30int dist[LEN];//某点的权值 起始点到目标点的权值int map[LEN][LEN];//某点到某点两点之间的权值bool isvisitd[LEN];//表示某点是否访问过//初始化map数组 设置为无穷大void init(int n){ for(int i = 0;i<=n;i++) { for(int j = 0;j<=n;j++) map[i][j] = MAX; } } //prim最小生成树的算法int prim(int n){ int i,j,min,pos,sum; sum = 0; //最小生成树的权值 //初始化,表示没有一点走过 memset(isvisitd,false,sizeof(isvisitd)); //初始化给dist数组赋值 for(i = 1;i<=n;i++){ dist[i] = map[1][i]; } isvisitd[1] = true;//标记1已被访问 从1开始 //找到权值最小点并记下位置 for(i = 1;i<n;i++){ min = MAX; for(j = 1;j<=n;j++){ if(!isvisitd[j]&&dist[j]<min){ min = dist[j]; pos = j;//记录下该位置 } } sum+=min; isvisitd[pos] = true; //更新权值 for(j = 1;j<=n;j++) { if(!isvisitd[j]&&dist[j]>map[pos][j]){ dist[j] = map[pos][j]; } } } return sum;}int main(){ int i,j,n,m,len; char start,end; while(scanf("%d",&n)!=EOF){ if(n==0){ break; } init(n);//初始化 for(i=0;i<n-1;i++){ cin>>start>>m; for( j = 0;j<m;j++){ cin>>end>>len; map[i+1][end-‘A‘+1] = len; map[end-‘A‘+1][i+1] = len; } } cout<<prim(n)<<endl; } return 0;}
运行结果如下:
最小生成树 Prim算法的实现及应用 http://blog.csdn.net/worker90/article/details/6642959
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。