title: poj-1251-最小生成树

date: 2018-11-20 16:38:14

tags:

  • acm
  • 刷题

    categories:
  • ACM-最小生成树

概述

前段时间数据结构的课上提到了了最小生成树,,暑假的集训虽然再学并查集的时候看过一些,,但是之后好久没再用过,,早就忘记了,,,今天抽时间看了看,,把最小生成树的两个主要算法 primkruskal了解了一下,,,做几道题,,把自己的模板弄出来

分析

这两个算法很简单,,,看几遍就可以去敲去了,,,

放几个别人的博客,,防止以后忘记了能快速回想起来

还有一个

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-最小生成树的更多相关文章

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

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

  2. 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 ...

  3. POJ 1251 Jungle Roads (prim)

    D - Jungle Roads Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Su ...

  4. Poj(1251),Prim字符的最小生成树

    题目链接:http://poj.org/problem?id=1251 字符用%s好了,方便一点. #include <stdio.h> #include <string.h> ...

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

    链接: http://poj.org/problem?id=1251 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2177 ...

  6. HDU 1301 Jungle Roads (最小生成树,基础题,模版解释)——同 poj 1251 Jungle Roads

    双向边,基础题,最小生成树   题目 同题目     #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stri ...

  7. POJ 1251 && HDU 1301 Jungle Roads (最小生成树)

    Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...

  8. [ 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求最小 ...

  9. POJ 1251 Jungle Roads(最小生成树)

    题意  有n个村子  输入n  然后n-1行先输入村子的序号和与该村子相连的村子数t  后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离  求链接全部村子的最短路径 还是裸的最小生成树咯 ...

  10. POJ 1251 Jungle Roads (最小生成树)

    题目: Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ...

随机推荐

  1. wait&waitpid状态值

    [wait&waitpid状态值] 1.  python 中 os.system 的返回值的format与wait的返回值status一致: On Unix, the return value ...

  2. 如何在python的字符串中输入纯粹的{}

    python的format函数通过{}来格式化字符串 >>> a='{0}'.format(123) >>> a ' 如果需要在文本中包含{}字符,这样使用就会报错 ...

  3. 2017 ACM暑期多校联合训练 - Team 9 1008 HDU 6168 Numbers (模拟)

    题目链接 Problem Description zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk gen ...

  4. spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解

    题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...

  5. Java设计模式——工厂模式

    一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...

  6. Hibernate5笔记4--单表查询

    单表查询:   Hibernate是DAO层技术,对数据的使用,查询是最为重要的.Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询及Hibernate特有的HQL查询. H ...

  7. Windows执行命令与下载文件总结

    1.前言 在渗透或是病毒分析总是会遇到很多千奇百怪的下载文件和执行命令的方法. 2.实现方式 2.1.Powershell win2003.winXP不支持 $client = new-object ...

  8. python使用twisted搭建的一个socket服务

    服务端 # -*- coding: utf-8 -*- # @Time : 2018/9/19 21:41 # @Author : cxa # @File : tsTservTW.py # @Soft ...

  9. JAVA中分为基本数据类型和引用数据类型区别

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  10. 打开mvc项目无法运行,报"Unable to launch the IIS Express Web server"

    今天遇到一个问题,打开asp.net mvc 项目,右击浏览器运行,无法运行... 提示下面错误, 解决方案: 删除项目文件夹下的 .vs 文件夹,然后重新打开项目运行即可 参考:http://www ...