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. 关于thinkpad安装win10操作系统

    thinkpad预装的是win8或者win10,会有自己的分区方式是GPT,所以会出现两个引导分区. F2进入tinkpad的bios,F12进入启动选项 我们用pe进入后,用分区工具删除两个分区,然 ...

  2. soj1564. HOUSING

    1564. HOUSING Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description For the Youth Olympic ...

  3. 2016-2017-20155329 《Java程序设计》第7周学习总结

    学号 2016-2017-20155329 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治标准时间(GMT时间) 世界时(UT) 国际原子时(TAI) 世界协调 ...

  4. php array转化为utf-8编码以便于转化为json数据

    php中转化为json时,字符串或数组编码必须为utf-8编码. 在网上找到了一个方法可以比较简单的转化,在此记录: 利用var_export()和eval()方法var_export():输出或返回 ...

  5. 【译】第九篇 Replication:复制监视器

    本篇文章是SQL Server Replication系列的第九篇,详细内容请参考原文. 复制监视器允许你查看复制配置组件的健康状况.这一篇假设你遵循前八篇,并且你已经有一个合并发布和事务发布.启动复 ...

  6. vue+hbuilder监听安卓返回键问题

    1.监听安卓返回键问题 效果:在一级页面按一下返回键提示退出应用,按两下退出应用;在其它页面中,按一下返回上个历史页面 1 2 import mui from './assets/js/mui.min ...

  7. [转]CMake快速入门教程:实战

    转自http://blog.csdn.net/ljt20061908/article/details/11736713 0. 前言    一个多月前,由于工程项目的需要,匆匆的学习了一下cmake的使 ...

  8. Libheap:一款用于分析Glibc堆结构的GDB调试工具

    Libheap是一个用于在Linux平台上分析glibc堆结构的GDB调试脚本,使用Python语言编写.         安装 Glibc安装 尽管Libheap不要求glibc使用GDB调试支持和 ...

  9. 利用python编写不同环境下都能运行的测试脚本

    利用bash来获取当前电脑的环境变量,可以写一个.sh文件,里面获取当前环境,然后在调用python文件执行 # -*- coding: utf-8 -*- import logging import ...

  10. aarch64_n1

    NFStest-2.1.5-0.fc26.noarch.rpm 2017-02-17 01:19 531K fedora Mirroring Project NLopt-2.4.2-11.fc26.a ...