惠民工程(2013中南大学研究生复试[最小生成树])

惠民工程

CSU - 1264

时限: 1000MS   内存: 131072KB   64位IO格式: %lld & %llu

提交 状态

已开启划词翻译

问题描述点击打开链接

市政府“惠民工程”的目标是在全市n个居民点间之架设煤气管道(但不一定有直接的管道相连,只要能间接通过管道可达即可)。很显然最多可架设 n(n-1)/2条管道,然而实际上要连通n个居民点只需架设n-1条管道就可以了。现请你编写程序,计算出该惠民工程需要的最低成本。

输入

测试输入包含若干测试用例。每个测试用例的第1行给出居民点数目M ( < =100 )、 评估的管道条数 N;随后的 N 行对应居民点间管道的成本,每行给出一对正整数,分别是两个居民点的编号,以及此两居民点间管道的成本(也是正整数)。为简单起见,居民点从1到M编号。

输出

对每个测试用例,在1行里输出全市管道畅通所需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

样例输入

3 3
1 2 1
1 3 2
2 3 4
3 1
2 3 2

样例输出

3
?

思路:

本题与hdoj 1863  畅通工程点击打开链接类似,典型的并查集,或者说是最小生成树得题目!

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int pre[1005];
struct node
{
 int p1;
 int p2;//p1,p2分别对应的两个居民点
 int v;//铺设管道所需的费用
} way[1005];
int m,n;

void init()
{
	memset(pre,0,sizeof(pre));
	memset(way,0,sizeof(way));
	for(int i=1;i<=m;i++)//初始化,每一个点当做是一个父节点
	 pre[i]=i;
}

int cmp(node a,node b)
{
return a.v<b.v;
}

int find(int x)//查找父节点
{
 int ret=x;
 while(pre[ret]!=ret) //如果查找到的父节点不是它本身,就直接把它当做一个新的父节点
  ret=pre[ret];
  int t=x,r;//下面是路径压缩
  while(t!=ret)
  {
   r=pre[t];   //在改变上一级额的父节点之前 用临时变量将它记录起来
   pre[t]=ret;//把上级节点改为父节点
   t=r;
  }
  return ret;
}

int join(int x,int y)  //判断两个点是否连通
{
  int fx=find(x);
  int fy=find(y);
  if(fx!=fy)//如果已经联通就不用管,否则将它并入之前的连通分支中
  {
   pre[fx]=fy;
   return 1;
  }
  return 0;
}

int main()
{
  while(~scanf("%d%d",&m,&n))
  {
   init();
   for(int i=0;i<n;i++)
     scanf("%d%d%d",&way[i].p1,&way[i].p2,&way[i].v);

     sort(way,way+n,cmp); //排序,目的是为了优先考虑成本低的将它并入连通分支  

     int ans=0;
      for(int i=0;i<n;i++)
       if(join(way[i].p1,way[i].p2))//如果已经联通就只需计算管道费用就行
           ans+=way[i].v;

          int count=0;
          for(int i=1;i<=m;i++)
             if(pre[i]==i)//判断是否都连通
                 count++;

      if(count>1)//如果不连通
        printf("?\n");
        else
          printf("%d\n",ans);
  }
  return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 14:14:55

惠民工程(2013中南大学研究生复试[最小生成树])的相关文章

1027: 逃离迷宫(2018年中南大学研究生复试机试题)

1027: 逃离迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 611  解决: 130[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 PIPI被困在一个迷宫中了!   给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,PIPI想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,PIPI可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,PIPI不能走到迷宫外面去.令人头痛的是,PIPI是个

1022: 淘金(2017年中南大学研究生复试机试题 )

1022: 淘金 时间限制: 1 Sec  内存限制: 128 MB提交: 205  解决: 75[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子.这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了.那么问题来了:你最多能淘金多少? 输入 对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200) 接下来n行,每行m个数,表示每个区域

1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )

1021: 机器人走迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 339  解决: 71[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱.他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走.当机器人不能走的时候,也就是下一步会遇到陷阱.迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会).请问这个机器人最多可以经过多

水仙花数(2013中南大学研究生上机复试题)

1261: 水仙花数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 633 Solved: 222 [Submit][Status][Web Board] 点击打开链接 Description 春天是鲜花灿烂的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花数. Input 输入数据

1028: 安全路径(2014年中南大学研究生复试机试题 )

1028: 安全路径 时间限制: 1 Sec  内存限制: 128 MB提交: 228  解决: 96[提交][状态][讨论版] 题目描述 卫斯理小说经常提及外星人,比如蓝血人. 在土星星球有很多城市,每个城市之间有一条或多条飞行通道, 但是并不是所有的路都是很安全的,每一条路有一个安全系数 s,s 是在  0  和1 间的实数 (包括 0 , 1) ,一条从 u 到 v 的通道 P 的安全度为 Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在蓝血人

1023: 巨人排队(2017年中南大学研究生复试机试题 )

1023: 巨人排队 时间限制: 1 Sec  内存限制: 128 MB提交: 185  解决: 58[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 巨人国的小学生放假了,老师要给小朋友们排队了.可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮).小朋友呢也很调皮,一旦老师给他排好队就不愿意动了.这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置.请问老师最少要给小朋友排几条路队呢? 输入 对于每组数

1008: 最大连续子序列(2014年中南大学研究生复试机试题 )

1008: 最大连续子序列 时间限制: 1 Sec  内存限制: 128 MB提交: 461  解决: 80[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 给定 K 个整数的序列{ N1,  N2,  ..., NK } ,其任意连续子序列可表示为{ Ni, Ni+1,...,Nj} ,其中1 <= i<= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 } ,其最大连续子序列为{ 11, -4

2014年哈工大计算机硕士研究生复试考试大纲

2014年哈工大计算机硕士研究生复试考试大纲 考试科目名称:计算机科学与技术     考试科目代码:[    ] 复试科目除C 语言外均为选择题,每题2分. (1)集合论与图论,占30分. (2)计算机体系结构,占30分. (3)编译原理,占30分 (4)数据库系统,占30分 (5)C语言程序设计,占50分 (6)软件工程,占30分 注1:生物信息技术专业学生不考计算机体系结构.编译原理,考生物信息学引论(30分).生物统计与基因组信息学(30分). 集合论与图论部分(30分) 一. 考试要求

中国科学院数学与系统科学研究院关于2019年招收硕士研究生复试规程

中国科学院数学与系统科学研究院关于2019年招收硕士研究生复试规程 2019-03-13 一.复试原则 2019年招收硕士研究生复试是对经过初试达到复试条件的考生进行的复查性考试,根据从德智体全面衡量.择优录取.保证质量和宁缺毋滥的原则,公开.公平和公正选拔人才,确保招生录取质量. 招生工作领导小组负责全院研究生复试工作的领导,研究生部组织实施,复试过程严格执行中国科学院大学招生复试工作相关政策规定. 二.复试分数线 参加复试的考生由我院招生工作领导小组根据考生初试成绩择优确定,其初试成绩必须达