时限: 1000MS   内存限制: 10000K
提交总数: 37001   接受: 17398

描述

热带岛屿拉格里山的首长有个问题。几年前,大量的外援花在了村庄之间的额外道路上。但是丛林不断地超越道路,因此庞大的道路网太昂贵而无法维护。老年人理事会必须选择停止维护一些道路。左上方的地图显示了目前正在使用的所有道路,以及每月维护这些道路的费用。当然,即使路线不像以前那么短,也需要采取某种方式在所有村庄之间保持通行。长老院长想告诉长老委员会每月要花多少钱才能维持连接所有村庄的道路。在上面的地图中,这些村庄被标记为A到I。右边的地图显示了可以最便宜地维护的道路,每月可节省216英亩。您的任务是编写一个解决此类问题的程序。

输入

输入由1到100个数据集组成,后面是仅包含0的最后一行。每个数据集都从仅包含数字n的行开始,n是村庄的数目,1 <n <27,并标记了村庄字母的前n个字母大写。每个数据集都以n-1行完成,这些行以字母顺序的村庄标签开头。最后一个村庄没有电话。村庄的每条线均以村庄标签开头,后跟从该村庄到带有字母标签的村庄的道路的数量k。如果k大于0,则该行以k条道路中的每条道路的数据继续。每条道路的数据是道路另一端的村庄标签,其后是道路的每月维护成本(以acms为单位)。维护成本将为小于100的正整数。该行中的所有数据字段均由单个空格分隔。公路网将始终允许所有村庄之间的旅行。该网络永远不会超过75条道路。到其他村庄的村庄中,没有一条道路会超过15条(在字母表中的前后)。在下面的示例输入中,第一个数据集与上面的地图一起显示。

产量

每个数据集的输出为每行一个整数:维护连接所有村庄的道路系统的每月最低费用(以aacms计)。警告:检查每条可能的道路的暴力解决方案都不会在一分钟的时间内完成。

样本输入

9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0

样本输出

216
30

资源

裸题,看不懂的话多看看图即可!

#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
#include<cstdio>
//---------------------------------Sexy operation--------------------------// #define cini(n) scanf("%d",&n)
#define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d)))
using namespace std;
//___________________________Dividing Line__________________________________/#
#define N 105
using namespace std; int father[28];
int rank[28];
int sum;
struct edge
{
int st;
int ed;
int w;
bool operator< (const edge x)const
{
return w<x.w;
}
} e[400];
int top = 0;
int find(int x)
{
if(x != father[x])
father[x] = find(father[x]);
return father[x];
}
void addEdge(int x, int y, int z)
{
e[top].st = x;
e[top].ed = y;
e[top].w = z;
top++;
}
int main()
{
int n,cnt,ans;
char a,c;
int edgeNum;
int weight1;
while(~scanf("%d",&n)&&n)
{
top =cnt=ans=0;
for(int i = 0; i < n -1 ; i++)
{
cin>>a;
cin>>edgeNum;
for(int j = 0; j < edgeNum; j++)
{
cin>>c;
cin>>weight1;
int k = int(c - 'A');
addEdge(i, k, weight1);
}
}
for(int i = 0; i <= n; i++)
{
father[i] = i;
}
//cout<<1<<endl;
sort(e,e+top);
for(int i=1;i<=n;i++) father[i]=i;
//cout<<1<<endl;
for(int i=0;i<top;i++)
{
int xx=find(e[i].st),yy=find(e[i].ed);
if(xx!=yy)
{
cnt++;
ans+=e[i].w;
father[yy]=xx;
if(cnt==n-1) break;
}
}
cout<<ans<<endl;
}
return 0;
}

poj1251 Jungle Roads Kruskal算法+并查集的更多相关文章

  1. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  2. 模板——最小生成树kruskal算法+并查集数据结构

    并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...

  3. POJ1251 Jungle Roads(Kruskal)(并查集)

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23882   Accepted: 11193 De ...

  4. POJ1861 Network (Kruskal算法 +并查集)

    Network Description Andrew is working as system administrator and is planning to establish a new net ...

  5. POJ1251 Jungle Roads Kruskal+scanf输入小技巧

    Jungle Roads The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ai ...

  6. 图论 Kruskal算法 并查集

    #include<iostream> #include<cstring> #include<string> #include<cstdio> #incl ...

  7. POJ - 1251 Jungle Roads (最小生成树&并查集

    #include<iostream> #include<algorithm> using namespace std; ,tot=; const int N = 1e5; ]; ...

  8. POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 83 ...

  9. poj1251 Jungle Roads(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...

随机推荐

  1. How to setup a Alpine Linux mirror

    How to setup a Alpine Linux mirror   Contents 1 Introduction 2 Setting up the cron job 3 Setting up ...

  2. git rebase解决合并冲突

    git rebase解决合并冲突   记录合并冲突解决方法,使用的git rebase,感觉很好用 1.git rebase 文档 https://git-scm.com/docs/git-rebas ...

  3. python3的subprocess的各个方法的区别(二)

    subprocess如何避免死锁 如果交互是双工的,即涉及读取和写入,则尤其如此.这种交互可能导致死锁,因为两个进程都可能最终等待另一个进程的输出 您希望从子进程标准输出管道读取,但标准错误管道的缓冲 ...

  4. vue-shop项目第二天(用于个人学习的记录)

    vue-shop项目第二天 1.实现路由导航守卫功能. router.beforeEach((to, from, next) => { // to 将要访问的路径 from 代表从哪个路径跳转而 ...

  5. Linux 磁盘管理篇,开机挂载

    设置开机挂载需要到 /etc/fstab 里设置 第一列:磁盘设备文件名或该设备的label 第二列:挂载点 第三列:磁盘分区文件系统 第四列:文件系统参数 第五列:能否被dump备份命令作用 第六列 ...

  6. Solr复杂查询一:函数查询

    一.简介 Solr的函数可以动态计算每个文档的值,而不是返回在索引阶段对应字段的静态数值集.函数查询是一类特殊的查询,它可以像关键词一样添加到查询中,对所有文档进行匹配并返回它们的函数计算值作为文档得 ...

  7. 作为python开发者,这几个PyCharm 技巧你必须掌握!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  8. 百度AI开发平台简介

    AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...

  9. 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!

    相信大家在使用各种各样强大的 IDE 写代码时都会注意到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套语法高亮规则.这样不仅美观,而且方便代码的阅读. 而在上古神器 Vim 中,我们通常 ...

  10. mysql数据库深入学习

    mysql 数据库 一.数据库介绍 1.关系型数据库的特点 ​ 二维表 典型产品Oracle传统企业,MySQL是互联网企业 数据存取是通过SQL 最大特点,数据安全性方面强(ACID) 2.NoSQ ...