poj-1251-最小生成树
title: poj-1251-最小生成树
date: 2018-11-20 16:38:14
tags:
- acm
- 刷题
categories: - ACM-最小生成树
概述
前段时间数据结构的课上提到了了最小生成树,,暑假的集训虽然再学并查集的时候看过一些,,但是之后好久没再用过,,早就忘记了,,,今天抽时间看了看,,把最小生成树的两个主要算法 prim 和 kruskal了解了一下,,,做几道题,,把自己的模板弄出来
分析
这两个算法很简单,,,看几遍就可以去敲去了,,,
prim算法主要的思路是将最小生成树慢慢的变大,,,
kruskal算法主要是利用并查集将多个树也就是森林慢慢的合并成最后的树
模板代码
做了一道模板题,,题意就是对给定的一个图,,去掉一些边,,求花费最小的方案,,,其实就是权值和最小的那一种,,
prim方法:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 30;
int mp[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int n , m;
int prim()
{
int sum = 0;
memset(vis , false , sizeof vis);
vis[1] = true;
for(int i = 1; i <= n; ++i)
dis[i] = mp[1][i];
for(int i = 1; i < n; ++i)
{
int m = inf;
int p = -1;
//从所有的为加入最小生成树集合的点集里找到一个边权最小的
for(int j = 1; j <= n; ++j)
if(!vis[j] && dis[j] < m)
{
m = dis[j];
p = j;
}
if(m == inf) return -1;
sum += m;
vis[p] = true;
//更新加入这个点之后能够到达其他点的值
for(int j = 1; j <= n; ++j)
if(!vis[j] && dis[j] > mp[p][j])
dis[j] = mp[p][j];
}
return sum;
}
int main()
{
while(scanf("%d" , &n) && n)
{
char c1 , c2;
int m1 , m2;
memset(mp , inf , sizeof mp);
for(int i = 1; i <= n; ++i)
mp[i][i] = 0;
for(int i = 1; i <= n - 1; ++i)
{
scanf(" %c%d" , &c1 , &m1);
for(int j = 1; j <= m1; ++j)
{
scanf(" %c%d" , &c2 , &m2);
mp[c1 - 'A' + 1][c2 - 'A' + 1] = m2;
mp[c2 - 'A' + 1][c1 - 'A' + 1] = m2;
}
}
printf("%d\n" , prim());
}
return 0;
}
kruskal方法:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 200;
const int inf = 0x3f3f3f3f;
int father[maxn];
int n , m;
struct edge
{
int u , v , w;
bool operator < (const edge &r) const
{
return w < r.w;
}
}edge[maxn];
int tot;
void addedge(int _u , int _v , int _w)
{
edge[tot].u = _u;
edge[tot].v = _v;
edge[tot++].w = _w;
}
int find(int x)
{
if(x == father[x]) return x;
else return father[x] = find(father[x]);
}
int kruskal()
{
for(int i = 1; i <= n; ++i)
father[i] = i;
sort(edge , edge + tot);
int cnt = 0;
int sum = 0;
for(int i = 0; i < tot; ++i)
{
int t1 = find(edge[i].u);
int t2 = find(edge[i].v);
//u , v如果不在一个森林中就合并
if(t1 != t2)
{
sum += edge[i].w;
father[t1] = t2;
++cnt;
}
if(cnt == n - 1) break;
}
if(cnt < n - 1) return -1;
else return sum;
}
int main()
{
while(scanf("%d" , &n) && n)
{
char c1 , c2;
int m1 , m2;
tot = 0;
for(int i = 1; i < n; ++i)
{
scanf(" %c%d" , &c1 , &m1);
for(int j = 1; j <= m1; ++j)
{
scanf(" %c%d" , &c2 , &m2);
addedge(c1 - 'A' + 1 , c2 - 'A' + 1 , m2);
addedge(c2 - 'A' + 1 , c1 - 'A' + 1 , m2);
}
}
printf("%d\n" , kruskal());
}
}
(end)
poj-1251-最小生成树的更多相关文章
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
poj 1251 && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...
- POJ 1251 Jungle Roads (prim)
D - Jungle Roads Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Su ...
- Poj(1251),Prim字符的最小生成树
题目链接:http://poj.org/problem?id=1251 字符用%s好了,方便一点. #include <stdio.h> #include <string.h> ...
- (最小生成树) Jungle Roads -- POJ -- 1251
链接: http://poj.org/problem?id=1251 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2177 ...
- HDU 1301 Jungle Roads (最小生成树,基础题,模版解释)——同 poj 1251 Jungle Roads
双向边,基础题,最小生成树 题目 同题目 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stri ...
- POJ 1251 && HDU 1301 Jungle Roads (最小生成树)
Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...
- [ An Ac a Day ^_^ ] [kuangbin带你飞]专题六 最小生成树 POJ 1251 Jungle Roads
题意: 有n个点 每个点上有一些道路 求最小生成树 解释下输入格式 A n v1 w1 v2 w2 A点上有n条边 A到v1权值是w1 A到v2权值是w2 思路: 字符串处理之后跑kruskal求最小 ...
- POJ 1251 Jungle Roads(最小生成树)
题意 有n个村子 输入n 然后n-1行先输入村子的序号和与该村子相连的村子数t 后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离 求链接全部村子的最短路径 还是裸的最小生成树咯 ...
- POJ 1251 Jungle Roads (最小生成树)
题目: Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ...
随机推荐
- [hadoop]hadoop2.6完全分布式环境搭建
在经过几天的环境搭建,终于搭建成功,其中对于hadoop的具体设置倒是没有碰到很多问题,反而在hadoop各节点之间的通信遇到了问题,而且还反复了很多遍,光虚拟机就重新安装了4.5次,但是当明白了问题 ...
- 微信小程序开发教程(七)逻辑层——.js详解
逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...
- 训练赛第二场C题 zoj 2339 Hyperhuffman
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2339 解题报告:题目太长了,比赛的时候根本看不懂,完了之后问了什 ...
- 【leetcode 简单】 第六十八题 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...
- sklearn评估模型的方法
一.acc.recall.F1.混淆矩阵.分类综合报告 1.准确率 第一种方式:accuracy_score # 准确率import numpy as np from sklearn.metrics ...
- Python练习-函数版-锁定三次登陆失败的用户
代码如下: # 编辑者:闫龙 if __name__ == '__main__': import UserLoginFuncation LoclCount=[]; while True: UserNa ...
- 【Nginx】 Nginx实现端口转发
什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口.此时如果我们可以通过 localhost:8001 //图书 loc ...
- mvn打war包以及解压包的方法
有时候我们需要查看打成war包之后的目录,如果是maven项目我们可以直接用maven打包. 1.maven打包: 第一种: mvn package 如果不行先 mvn clean一下 第二种:(掌握 ...
- 终端多窗口分屏Terminator
1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E 垂直分割窗口 Ctrl+ ...
- Linux内核跟踪之trace框架分析【转】
转自:http://blog.chinaunix.net/uid-20543183-id-1930846.html ---------------------------------------- ...