布线问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
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 算法也是寻找最小的边,但是看起来比较麻烦,比较省时间:
AC代码一:克鲁斯卡尔算法
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
struct T
{
int x,y,z;
}num[];
int cmp(T a, T b)
{
if(a.z < b.z)
return ;
return ;
}
int main()
{
int i,j,k,t,m,n,g,a[],aa;
cin>>t;
while(t--)
{
cin>>m>>n;
int ans=,sum=,maxx=;
for(i=; i<=m; i++)//初始化的时间要注意
a[i]=i;
for( i=; i< n; i++)
cin>>num[i].x>>num[i].y>>num[i].z;
for(i=;i<=m;i++)
{
cin>>aa; if(aa<maxx) maxx=aa;
}
sort(num,num+n,cmp);//按照权值进行排序
for(i=;i< n && sum<m- ; i++)
{
for(k=num[i].x ; a[k]!=k ;k=a[k])
a[k]=a[a[k]];
for(g=num[i].y ; a[g]!=g ;g=a[g])
a[g]=a[a[g]];
if(k!=g)
{
a[g]=k;
ans=ans+num[i].z;
sum++;
}
}
cout<<ans+maxx<<endl;
}
return ;
}

AC代码二:普利姆算法

 #include<stdio.h>
#include<string.h>
#define MAX 1<<28
int map[][];
int e,v;
int prime()
{
bool flag[];//标记数组;
int path[],i,j,sum=;//path 路径
for(i=; i<=v; i++)
{
flag[i]=;// 全部标记为0;
path[i]=map[][i];//把上面的一组数
}
flag[]=;
for(i=; i<v; i++)// v 表示的是村庄数,寻找n-1条边
{
int k , min=MAX;
for(j=; j<=v; j++)
{
if( !flag[j] && path[j]<min ) //如果这个节点没有标记,并且路径小于以前的
{
min=path[j];k=j;
//printf("%d ",path[j]); printf("%d \n",k);
}
}
sum+=path[k];
//printf("***\n");
flag[k]=;
for(j=; j<=v; j++)
{
if( !flag[j] && path[j] > map[k][j] )//如果大于已经存在的边了,就不要它了
path[j]=map[k][j]; //否则继续寻找下一个节点
}
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b,c,i;
scanf("%d%d",&v,&e);
memset(map,,sizeof(map));
while(e--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b])
map[a][b]=map[b][a]=c<map[a][b]?c:map[a][b];//如果后来再一次出现相同的路径,则保存最小的权值
}
int min=,k;
for(i=;i<v;i++)
{
scanf("%d",&k);
if(min>k)
min=k;
}
printf("%d\n",prime()+min);
}
return ;
}

nyoj 38 布线问题 Kruskal and Prim的更多相关文章

  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 布线问题 (最小生成树 prim)

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

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

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

  5. nyoj 38 布线问题

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

  6. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  7. 最小生成树——Kruskal与Prim算法

    最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...

  8. 最小生成树(kruskal模版 Prim模板)

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 最小生成树,最重要的是了解思想 稠密图用Prim,稀疏图用Kru ...

  9. [图论]最优布线问题:kruskal

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

随机推荐

  1. IE8 通过Jquery动态修改html不显示的问题

    for (var i = 0; i < _priority_transf.length && i < xmlList.length; i++) { if (textCont ...

  2. 解决 PowerDesigner 错误 The generation has been cancelled because errors have been found by the check model.

    在通过概念数据模型生成为物理数据模型时出现错误“The generation has been cancelled because errors have been found by the chec ...

  3. cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測

    对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...

  4. SpringSecurity实现后台管理员登录(二)

    需求:login.ftl页面中登录成功后进入index.ftl页面中 一.pom.xml中添加json转换相关的包 <dependency> <groupId>com.fast ...

  5. [Angular-Scaled web] 5. ui-router $stateParams for sharing information

    When using ui-route, we want to pass the information with the url. Example: angular.module('categori ...

  6. Unity Editor Toolbar 编辑器扩展

    http://www.cnblogs.com/zhaoqingqing/p/3812368.html 1.Apply to Prefab [把改动应用到Prefab] if (GUILayout.Bu ...

  7. android开机启动代码

    1)public class StartupReceiver extends BroadcastReceiver { @Override public void onReceive(Context c ...

  8. Python 遍历set

    遍历set 由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现. 直接使用 for 循环可以遍历 set 的元素: weekdays = set([' ...

  9. Generator [ˈdʒenəreɪtə(r)] 函数结构

    Generator函数是ES6新增的一种异步编程方案. 说明:Generator函数指的是一种新的语法结构,是一个遍历器对象生成器,它内部可以封装多个状态,非常适合用于异步操作. Generator函 ...

  10. 阿里云RDS实例内不同数据库之间的数据迁移

    适用场景 本文适用于使用DTS实现相同实例下库名不同的数据库之间的数据迁移.本文以使用DTS将同一RDS实例下的amptest库迁移到jiangliu_amptest库为例来说明如何使用DTS实现相同 ...