38-布线问题

内存限制:64MB
时间限制:1000ms
Special Judge: No

accepted:5
submit:11

题目描述:

南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
2、所用电线花费最少

输入描述:

第一行是一个整数n表示有n组测试数据。(n<5)
每组测试数据的第一行是两个整数v,e.
v表示学校里楼的总个数(v<=500)
随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )
(楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
数据保证至少存在一种方案满足要求。

输出描述:

每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。

样例输入:

复制

1
4 6
1 2 10
2 3 10
3 1 10
1 4 1
2 4 1
3 4 1
1 3 5 6

样例输出:

4

分析:
  ①、他要求的布线情况(因为一定有结果)就是求图的最短路径问题
  ②、我们可以考虑右prim算法
    1、prim算法就是由任意一个点开始找最短的路径
    2、在前一个的基础上我们可以得到两个点且改两个点已经连接上
    3、现在我们要找的就是经过第一个或第二个点的最小路径
    4、依次循环直到遍历所有的点
 ③、从外面连入的线我们直接根据升序排序,再取最小的值
 ④、两者相加即为结果 核心代码(prim模板):
 int prim()
{
int cnt = , pos = , my_weight[n+], my_book[n+] = {, }; // cnt表示最小的布线情况
for(int i = ; i <= n; ++ i)
if(!my_book[i])
my_weight[i] = my_map[pos][i];
for(int i = ; i < n; ++ i)
{
int my_min = MAXNUM;
for(int j = ; j <= n; ++ j)
{
if(!my_book[j] && my_weight[j] < my_min)
{
my_min = my_weight[j];
pos = j;
}
}
cnt += my_min;
my_book[pos] = ;
for(int j = ; j <= n; ++ j)
{
if(!my_book[j] && my_weight[j] > my_map[j][pos])
my_weight[j] = my_map[j][pos];
}
}
return cnt;
}

C/C++代码实现(AC):

 #include <bits/stdc++.h>

 using namespace std;
const int MAXN = ;
const int MAXNUM = 0x3f3f3f3f;
int my_map[MAXN][MAXN], n, m, my_line[MAXN]; int prim()
{
int cnt = , pos = , my_weight[n+], my_book[n+] = {, }; // cnt表示最小的布线情况
for(int i = ; i <= n; ++ i)
if(!my_book[i])
my_weight[i] = my_map[pos][i];
for(int i = ; i < n; ++ i)
{
int my_min = MAXNUM;
for(int j = ; j <= n; ++ j)
{
if(!my_book[j] && my_weight[j] < my_min)
{
my_min = my_weight[j];
pos = j;
}
}
cnt += my_min;
my_book[pos] = ;
for(int j = ; j <= n; ++ j)
{
if(!my_book[j] && my_weight[j] > my_map[j][pos])
my_weight[j] = my_map[j][pos];
}
}
return cnt;
} int main()
{
int t;
scanf("%d", &t);
while(t --)
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++ i)
for(int j = ; j <= n; ++ j)
my_map[i][j] = MAXNUM;
for(int i = ; i < m; ++ i)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
my_map[a][b] = my_map[b][a] = c;
} for(int i = ; i < n; ++ i)
scanf("%d", &my_line[i]);
sort(my_line, my_line + n, less<int>());
printf("%d\n", my_line[] + prim());
}
return ;
}

nyoj 38-布线问题(prim, sort)的更多相关文章

  1. NYOJ 38布线问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=38 布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳 ...

  2. NYOJ 38 布线问题_(解法2 Prim算法)

    时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式.该布线方式须要满足下面条件: 1.把全部的楼都供 ...

  3. nyoj 38 布线问题 Kruskal and Prim

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的 ...

  4. NYOJ 38 布线问题 (最小生成树 prim)

    题目链接 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测 ...

  5. NYOJ 38 布线问题_(解法1 Kruskal算法)

    时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式,该布线方式须要满足下面条件: 1.把全部的楼都供 ...

  6. nyoj 38 布线问题

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=38 最小生成树水题~ 代码: #include "stdio.h" / ...

  7. [图论]最优布线问题:prim

    最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...

  8. 【待修改】nyoj 38 最小生成树

    package nyoj; import java.util.Scanner; public class Main { public static void main(String args[]) { ...

  9. NYIST OJ 题目38 布线问题

    最小生成树水题,先按最小生成树做,答案最后加上最小的从第i号楼接线到外界供电设施所需要的费用即可. #include<cstdio> #include<cstring> #in ...

随机推荐

  1. phpstorm 设置换行符的格式

    菜单 >  文件 > 设置

  2. StreamWriter 相关知识分享

    在介绍StreamWriter之前,我们首先来了解一下它的父类TextWriter. 一.TextWriter 1.TextWriter的构造函数和常用属性方法 下面是TextWriter的构造函数: ...

  3. 轻量级CNN模型之squeezenet

    SqueezeNet 论文地址:https://arxiv.org/abs/1602.07360 和别的轻量级模型一样,模型的设计目标就是在保证精度的情况下尽量减少模型参数.核心是论文提出的一种叫&q ...

  4. calendar类-时间处理类

    calendar类 calendar类是时间处理类 比如在scala中 //字符串转化日期格式 val df = new SimpleDateFormat("yyyy-MM-dd hh:mm ...

  5. Mybatis和Mysql的Datetime的一些问题

    Mysql的时间类型 时间类型有time, date, datetime, timestamp 如Mysql官方文档所述: time 没有date,date没有time,datetime是date和t ...

  6. Java基础(二十四)Java IO(1)输入/输出流

    在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称为输出流. 输入流的指向称为源,程序从指向源的输入流中读取数据. 输出流的指向是字节要去的目的地, ...

  7. SpringBoot整合Swagger2(Demo示例)

    写在前面 由于公司项目采用前后端分离,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理 ...

  8. 关于typedef和struct

    在struct中使用自身,需要加struct关键字,无论带不带typedef,例如: struct A { int a; struct A *pA; }; 在定义struct方面尽量不要使用typed ...

  9. swift ARC中的strong、weak、unowned

    Swift 用自动引用计数ARC(Automatic Reference Counting)方式来跟踪和管理app的内存使用.这使得内存管理成为swift内部的机制,不需要认为考虑.ARC会自动释放那 ...

  10. C++学习笔记10_输入输出流.文件读写

    //从键盘输入到程序,叫标准input:从程序输出到显示器,叫标准output:一并叫标准I/O //文件的输入和输出,叫文件I/O cout<<"hellow word&quo ...