题意:

输入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. Why String is Immutable or Final in Java

    The string is Immutable in Java because String objects are cached in String pool. Since cached Strin ...

  2. SQL Server中SCAN 和SEEK的区别

    SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...

  3. dedecms获取当前文章所在栏目URL

    我们知道dedecms有一个面包屑导航的调用函数,{dede:field name='position'/},这个样式是固定的,有时要个性化一些的话需要修改很多地方,那么织梦cms有没其他方法获取当前 ...

  4. 用Delphi写一个UTF8编码格式的文本文件

    ... var f: TextFile; begin AssignFile(f, 'test.txt'); Rewrite(f); write(f, #$EF+#$BB+#$BF); // UTF-8 ...

  5. 前端js如何生成一个对象,并转化为json字符串

    https://www.cnblogs.com/May-day/p/6841958.html 一,直接上代码 <script src="../../Content/jquery-2.0 ...

  6. hdu3339In Action(最短路+01背包)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/H Description Since 1945, whe ...

  7. 深度学习Momentum(动量方法)

    转自:http://blog.csdn.net/bvl10101111/article/details/72615621 先上结论: 1.动量方法主要是为了解决Hessian矩阵病态条件问题(直观上讲 ...

  8. 如何实现parseFloat保留小数点后2位

    Number.toPrecision(2);function toPrecision ( [precision : Number] ) : String参数 precision 可选项.有效位数.值必 ...

  9. VS中代码对齐等快捷键

    在VS2008中,选定代码后,按Ctrl+K+F组合键,可以自动进行代码对齐. 注意:要先按下Ctrl和K,再按下F,因为Ctrl+F是查找的快捷键. 也可以先按下Ctrl+K,再按下Ctrl+F. ...

  10. 《Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences》

    Kalchbrenner’s Paper Kal的这篇文章引用次数较高,他提出了一种名为DCNN(Dynamic Convolutional Neural Network)的网络模型,在上一篇(Kim ...