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 ...
随机推荐
- [Node.js] querystring类
和参数相关的帮助类,原生自带,直接 require('querystring') 即可使用. 此类一共包括4个方法: querystring.stringify(obj, [sep], [eq]) q ...
- 你知道吗?10个精妙的 Java 编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- 基本控件文档-UIScrollView
CHENYILONG 基本控件文档-UIScrollView Fullscreen 基本使用作用UIScrollView可 ...
- 对某道ctf的一点点记录
题目:http://ctf5.shiyanbar.com/web/pcat/index.php 是一道注入的题,主要利用了offset 和 group by with rollup的知识 1.offs ...
- 天梯赛 L2-023. (模拟) 图着色问题
题目链接 题目描述 图着色问题是一个著名的NP完全问题.给定无向图 G = (V, E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解决这 ...
- Java并发编程(2) AbstractQueuedSynchronizer的设计与实现
一 前言 上一篇分析AQS的内部结构,其中有介绍AQS是什么,以及它的内部结构的组成,那么今天就来分析下前面说的内部结构在AQS中的具体作用(主要在具体实现中体现). 二 AQS的接口和简单示例 上篇 ...
- VM虚拟机上连接usb无反映
主机的usb连接又是正常的,排除了usb3.0的接口原因后,突然想到了是不是虚拟机的什么服务没有开?进入到控制面板->管理工具->服务,找到 V开头的,发现原来确实是虚拟机有关usb的服务 ...
- java基础50 配置文件类(Properties)
1. 配置文件类Properties的概念 主要生产配置文件与读取配置文件的信息 2.Properties要注意的细节 1.如果配置文件一旦使用了中文,那么在使用store方法生产的配置文件额时候字符 ...
- 洛谷P1120 小木棍(升级版)
传送门啦 一道经典的搜索剪枝题,不废话,步入正题. 分析: 一.输入时手动过滤不合法的情况 二.很明显我们要枚举把哪些棍子拼接成原来的长棍,而原始长度(原来的长棍的长度)都相等,因此我们可以在 $ d ...
- WINDOWS 2008 采用IP策略解决445,139等病毒攻击问题
@echo off title 创建IP安全策略,屏蔽135.. . . . 等端口 :: 配置说明文档地址 :: http://blog.csdn.net/lpc_china/article/det ...