题意:

输入n,然后接下来有n-1行表示边的加边的权值情况。如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25。求连接这棵树的最小权值。

思路:

一开始是在做莫队然后发现没学过最小生成树,就跑过来做模板题了...

Kruskal的使用过程:先按权值大小排序,然后用并查集判断是否能加这条边

Kruskal详解博客:【贪心法求解最小生成树之Kruskal算法详细分析】---Greedy Algorithm for MST

考试周还在敲代码...我...

update:最近复习模板,蓝桥杯不给带模板TAT,顺手A了Prim做法。

代码:

/*Prim*/
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = + ;
const int seed = ;
const ll MOD = ;
const int INF = 0x3f3f3f3f;
int mp[maxn][maxn];
int dis[maxn], vis[maxn], pre[maxn], n, ans;
void init(){
scanf("%d", &n);
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
scanf("%d", &mp[i][j]);
}
}
vis[] = ;
for(int i = ; i <= n; i++){
dis[i] = mp[][i];
pre[i] = ;
}
}
void prim(){
ans = ;
for(int i = ; i <= n - ; i++){
int pos, Min = INF;
for(int j = ; j <= n; j++){
if(!vis[j] && dis[j] < Min){
pos = j;
Min = dis[j];
}
}
vis[pos] = ;
ans = max(ans, mp[pos][pre[pos]]);
for(int j = ; j <= n; j++){
if(!vis[j] && mp[j][pos] < dis[j]){
dis[j] = mp[j][pos];
pre[j] = pos;
}
}
}
}
int main(){
int t, n;
scanf("%d", &t);
while(t--){
init();
prim();
printf("%d\n", ans);
}
return ;
}

代码:

#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
const int N = 1e5+;
const int MOD = ;
using namespace std;
struct edge{
int u,v,value;
friend bool operator < (edge a,edge b){
return a.value < b.value;
}
}e[N];
int fa[];
int find(int x){
return fa[x] == x? x : find(fa[x]);
}
int main(){
int n,u,v,tmp;
int num;
char s[];
while(scanf("%d",&n) && n){
num = ;
for(int i = ;i < ;i++) fa[i] = i;
for(int i = ;i <= n-;i++){
scanf("%s%d",s,&tmp);
u = s[] - 'A';
for(int j = ;j <= tmp;j++){
scanf("%s%d",s,&e[num].value);
e[num].u = u;
e[num].v = s[] - 'A';
num++;
}
}
sort(e,e+num);
int ans = ;
for(int i = ;i < num;i++){
int x = find(e[i].u);
int y = find(e[i].v);
if(x != y){
fa[x] = fa[y];
ans += e[i].value;
}
}
printf("%d\n",ans);
}
return ;
}

POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解的更多相关文章

  1. POJ1251 Jungle Roads 【最小生成树Prim】

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19536   Accepted: 8970 Des ...

  2. POJ1251 Jungle Roads(Kruskal)(并查集)

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23882   Accepted: 11193 De ...

  3. POJ1251 Jungle Roads Kruskal+scanf输入小技巧

    Jungle Roads The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ai ...

  4. HDU1301&&POJ1251 Jungle Roads 2017-04-12 23:27 40人阅读 评论(0) 收藏

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25993   Accepted: 12181 De ...

  5. poj 1251 Jungle Roads (最小生成树)

    poj   1251  Jungle Roads  (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...

  6. kruskal算法求最小生成树(jungle roads的kruskal解法)

    注意: 注意数组越界问题(提交出现runtimeError代表数组越界) 刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越 ...

  7. POJ1251 Jungle Roads【最小生成树】

    题意: 首先给你一个图,需要你求出最小生成树,首先输入n个节点,用大写字母表示各节点,接着说有几个点和它相连,然后给出节点与节点之间的权值.拿第二个样例举例:比如有3个节点,然后接下来有3-1行表示了 ...

  8. poj1251 Jungle Roads(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...

  9. poj1251 Jungle Roads Kruskal算法+并查集

    时限: 1000MS   内存限制: 10000K 提交总数: 37001   接受: 17398 描述 热带岛屿拉格里山的首长有个问题.几年前,大量的外援花在了村庄之间的额外道路上.但是丛林不断地超 ...

随机推荐

  1. 【pyqt5】QdateTimeEdit(日期时间)

    返回当前日期和时间设置 from PyQt5 import QtCore, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): ...

  2. python-面向对象-10-单例

    单例 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟 ...

  3. kettle中源和目标表结构不一致的情况处理

    创建数据仓库的过程中,往往会遇到这样的问题,例如:源表由于业务原因新增了字段,而ETL程序中是按照之前的源表结构进行抽取的,那么如果不重新构建ETL程序,新的指标就不会流入DW,问题如下图所示 创建了 ...

  4. 安装HDF5及在VS下配置HDF5

    最近要用到HDF5来存储数据,想要安装尝试用一下.发现网上有两种安装方式,一种是obtain518.html:获取最新的HDF5-1.8软件;另一种是cmakebuild518.html:使用CMAK ...

  5. openstack 部署笔记--nova

    控制节点 配置用户与服务 $ . admin-openrc $ openstack user create --domain default --password-prompt nova $ open ...

  6. slideUp() 函数

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [lr] 矫正白平衡

    中性色区域 • 定义 中性色又称为无彩色系,是指由黑色.白色及由黑白调和成的各种深浅不同的灰色系列.中性色既不属于冷色调,也不属于暖色调.黑白灰是常用到的三大中性色.中性色区域是指不包含色彩的区域,准 ...

  8. css 播放器按钮实现

    效果图 html代码 //播放按钮 <div id="playBtn" class="circle" style="margin: 20px 0 ...

  9. vs计算代码行数

    1.用vs打开程序 2.编辑——查找——在文件中查找 3.查找内容^b*[^:b#/]+.*$   应用正则表达式,在整个解决方案中,文件类型空 4.查找全部,仔细盯着右下角数字,查找完毕后会自动消失 ...

  10. Python 为什么sys.stdout.write 输出时后面总跟一个数字

    sys.stdout 是标准输出文件.write就是往这个文件写数据. 合起来就是打印数据到标准输出 因为-在交互模式下会输出函数返回值,而write会返回输出的字符数量.在命令行里不会显示