NYOJ 38 布线问题 (最小生成树 prim)
描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
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算法求最小生成树,在同一个图中的最小生成树一定是唯一确定的,所以不管从那个点开始建树都是一样的,首先求起始点到其一每个点的最短距离,然后把最短距离的那个点与起始点一起构成树,然后循环找没有在树中且与树的距离最短的点。
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
int Tu[502][502];
int dis[502];
int bj[502];
int v,e;
int prim()///普里姆算法
{
int sum=0;
for(int i=1; i<=v; i++)
{
dis[i]=Tu[1][i];///到i点的最短距离
bj[i]=0;///标记这个点有没有访问过
}
bj[1]=1;///1点访问过了
int flag=1;///下一个起始点
int cut=1;///线的个数
while(cut<v)
{
int Min=INF;
for(int i=1; i<=v; i++)
{
if(bj[i]==0&&dis[i]<Min)///找到下一个最短距离
{
Min=dis[i];
flag=i;
}
}
sum+=dis[flag];///加上这个距离
bj[flag]=1;///标记flag点访问过
cut++;///条数加
for(int i=1; i<=v; i++)
if(bj[i]==0&&dis[i]>Tu[flag][i])///这个点没有访问过并且最短距离可以更新
{
dis[i]=Tu[flag][i];
}
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&v,&e);
int a,b,c;
for(int i=1; i<=v; i++)
for(int j=1; j<=v; j++)
{
if(i==j)
Tu[i][j]==0;
else
Tu[i][j]=INF;
}
while(e--)
{
scanf("%d%d%d",&a,&b,&c);
Tu[a][b]=Tu[b][a]=min(Tu[a][b],c);///可能会存在重复输入路径的情况
}
int Min=0x3f3f3f3f;
int num;
for(int i=1; i<=v; i++)///求得最小的外接费用
{
scanf("%d",&num);
Min=min(Min,num);
}
printf("%d\n",prim()+Min);
}
return 0;
}
NYOJ 38 布线问题 (最小生成树 prim)的更多相关文章
- NYOJ 38布线问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=38 布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳 ...
- NYOJ 38 布线问题_(解法2 Prim算法)
时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式.该布线方式须要满足下面条件: 1.把全部的楼都供 ...
- nyoj 38 布线问题 Kruskal and Prim
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的 ...
- nyoj 38 布线问题
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=38 最小生成树水题~ 代码: #include "stdio.h" / ...
- 布线问题 最小生成树 prim + kruskal
1 : 第一种 prime 首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...
- p1221网络布线(最小生成树 Prim(普里母)算法) p1222 Watering Hole
描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路 ...
- NYOJ 38 布线问题_(解法1 Kruskal算法)
时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式,该布线方式须要满足下面条件: 1.把全部的楼都供 ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
随机推荐
- 现代web开发需要学习的15大技术
现代Web开发需要学习的15大技术 2016-06-08 13:08 快进到现在,我发现现代web开发再一次将发生压倒性的改变.信息资讯的铺天盖地令人迷惑,尤其对于初学者而言.首要原因是新的框架,例如 ...
- MinGW安装图文教程以及如何配置C语音编程环境
MinGW安装图文教程以及如何配置C语音编程环境 转载自:http://www.jb51.net/softjc/192017.html MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序 ...
- 名字管理系统demo
# 名字管理系统demo # 打印功能提示 print('欢迎使用名字管理系统v6.6.6') print('1:添加一个名字') print('2:删除一个名字') print('3:修改一个名字' ...
- 自动化测试(一)-get和post的简单应用
今天主要介绍两种测试的接口post和get: get和post是http的两种基本请求方式,区别在于get把参数包含在url中传递:给而post把参数以json或键值对的方式利用工具传递. get的传 ...
- Lua工具类
1.打印table --一个用以打印table的函数 function print_r (t, name) print(pr(t,name)) end function pr (t, name, in ...
- c free 使用MSDN library定制
为了不使用vc6但是还要使用visual assist的各种自动功能,决定使用c free ,但是怎么调用微软的MSDN library呢,我目前使用的版本是MSDN 1.5精简版bing自动翻译的. ...
- Visual Studio 2012安装包
点击下载
- Python 学习笔记之 Numpy 库——文件操作
1. 读写 txt 文件 a = list(range(0, 100)) a = np.array(a) # a.dtype = np.int64 np.savetxt("filename. ...
- Mybatis实例教程整体说明
什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或 ...
- To Chromium之浏览器外框UI(2)
之前一些文章本来是草稿状态,一次性全release出来了,排版上可能看上去不太舒服,等哪一天研究下改改排版. Here继续chromium的UI,看看,浏览器的外壳是怎么被画出来的:) 可以先关注下几 ...