HDU 1863畅通工程(最小生成树)(prim算法)
畅通工程
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10637 Accepted Submission(s): 4240
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
#include<stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1) return KGCD(a, b>>1); if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}
int LCM(int a,int b){ return a/KGCD(a,b)*b; }
int dir[5][2]={0,1,0,-1,1,0,-1,0};
using namespace std;
int map[110][110];
int p(int x)
{int lowcost[110];//记录的是到每个点的最小权值int mas[110];//记录每个点是那个点过去的int sum=0;memset(lowcost,0,sizeof(lowcost));memset(mas,0,sizeof(mas));for(int i=2;i<=x;i++) //开始默认第一个为初始点{ lowcost[i]=map[1][i];mas[i]=1; //所有的起点都默认1 }mas[1]=0;for(int i=2;i<=x;i++)//需要扫描的次数 {int min=INF;int minid=0;for(int j=2;j<=x;j++){if(lowcost[j]<min && lowcost[j]!=0){min=lowcost[j];//刷新最小值 minid=j; //标记下最小的那个点是哪里 }} if(min==INF)//判断下 是否可以找到 如果找不到就退出return 0;sum=sum+min;lowcost[minid]=0;for(int j=2;j<=x;j++)//借助minid 点 搜索所有它可以到达的点 然后减少下范围。{if(map[minid][j] < lowcost[j] && map[minid][j]!=INF){lowcost[j]=map[minid][j];mas[j]=minid;}} }return sum;
}
int main()
{int n,m,x,y,cost;while(scanf("%d%d",&n,&m)!=EOF){memset(map,0,sizeof(map));if(n==0)break;for(int i=1;i<=m;i++)//初始化图 {for(int j=1;j<=m;j++){map[i][j]=INF;}}for(int i=0;i<n;i++)//开始构建图 {scanf("%d%d%d",&x,&y,&cost);map[x][y]=map[y][x]=cost;}cost=p(m);if(cost)printf("%d\n",cost);elseprintf("?\n"); }return 0;
}
prim算法详细介绍:https://www.61mon.com/index.php/archives/199/
HDU 1863畅通工程(最小生成树)(prim算法)相关推荐
- HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...
- HDU 1863 畅通工程 最小生成树
思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...
- HDU——1863 畅通工程(最小生成树问题)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 题意:有m个村庄,还给出了n条道路的具体信息.问你能否使m个村庄畅通,且最小花费是多少? 解题思 ...
- HDU 1863 畅通工程
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 畅通工程//最小生成树prim
题目: 畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu 1232 畅通工程 最小生成树 并查集
1232的连接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 #include <iostream>#include <cstdio& ...
- [Java学习] 最小生成树——Prim算法
文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...
- 最小生成树Prim算法Java版
最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...
- D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135
理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...
最新文章
- 牛客--追债之旅 两种解法
- 面试官问我,使用Dubbo有没有遇到一些坑?我笑了。
- keras 导出onnx并使用
- oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
- 腾讯2019暑期实习生提前批CV岗笔试题
- 程序员一定要提升技术之外的能力
- 达摩院成立XG实验室!阿里官宣进军5G
- 试题14 回文数(详解)
- mysql 改变 执行计划_诡异的MySql执行计划的更改
- red_hat_enterprise_linux
- 算丰征途「SOPHON盘古无人驾驶系统」基本框架介绍
- Leecode:数组中的最长山脉
- android 当电脑屏幕,手机变身为电脑的第二屏幕?让你把手机当成电脑用!
- 【Practical】线性空间
- 更改会话语言oracle,alter session 修改的参数值在会话中如何回退
- PHP+python+nodejs+ springboot+vue 社区互助平台
- ARMv7和ARMv8架构比较
- 空气源热泵控制系统解决方案
- 【HDOJ】4210 Su-domino-ku
- python+django线上教学平台vue教育系统