首页 > 代码库 > NYOJ 38 布线问题
NYOJ 38 布线问题
思路:刚学的最小生成树,顺便找个题目做一下~,普里姆算法轻松ac,没难度。。下次用kruskal算法试下
附上ac码:
#include <stdio.h>#include <string.h>int e[501][501];//储存地图 int h[501];int mintree;int v,l;int prime()//普里姆算法 { int i,j; int book[501];//判断回路用的,book为1的表示已经加入树节点的楼 int temp; int count=0;//表示加入树节点的数量 int dis[501];//更新数组,作为辅助用 int sum = 0;//最小路径 int flag; memset(book,0,sizeof(book)); book[1] = 1; count++; for(i = 1; i<=v;i++) { dis[i] = e[1][i]; } while(count<v) { temp = 99999; for(j = 1;j<=v;j++) { if(book[j]==0&&dis[j]<temp) { temp = dis[j]; flag = j; } } book[flag] = 1; count++; sum +=dis[flag]; for(j=1;j<=v;j++) { if(book[j]==0&&dis[j]>e[flag][j]) dis[j] = e[flag][j]; } } mintree = sum; return 0 ;}int main(){ //freopen("data.txt","r",stdin); mintree = 99999;//最后输出结果 int minl;//外界接电需要的钱 int num; int i,j,value;//临时变量 scanf("%d",&num); while(num--) { minl = 99999; scanf("%d %d",&v,&l); //初始化地图 for(i =1;i<=v;i++) { for(j =1;j<=v;j++) { if(i==j) e[i][j] = 0; else e[i][j] = 99999; } } //读入数据 for(int k = 1;k<=l;k++) { scanf("%d %d %d",&i,&j,&value); e[i][j] = value; e[j][i] = value; } //找出外界接电的最小值 for(i =1;i<=v;i++) { scanf("%d",h+i); minl = minl>h[i]?h[i]:minl; } prime(); printf("%d\n",mintree+minl); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。