此题是最基础的最小生成树的题目,有两种方法, 一个是prim一个是kruskal算法,前者利用邻接矩阵,后者是利用边集数组

prim算法的思想是:一个点一个点的找, 先找从第一个点到其他点最小的, 把权值存放到一个lowcost的数组中,然后继续找下一个点,然后更新lowcost数组,注意,这时的lowcost不完全是第二个点到所有点的距离,而是,其他点到最小生成树的距离,然后一步一步的求,知道求完所有点

kruskal算法的思想是:先把边集数组按照权值进行排序,之后从最小的往上找,这时有个前提,就是不能有环,这样就能保证最大连通量为1,借助father数组

代码如下:

方法一(Prim):

 #include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = + ;
const int INFINITY = ;
int map[MAX][MAX];
int Sum;
int v, e;//v来存点的个数,e来存边的个数
void mini_span_tree_prim()
{
int lowcost[MAX];
lowcost[] = ;//标记已经加到最小生成树中
for(int i = ; i <= v; i++)
{
lowcost[i] = map[][i];
}
for(int i = ; i <= v; i++)
{
int j = ;
int index = ;
int minweight = INFINITY;
while(j <= v)
{//找出最小的边来,并保存其坐标
if(lowcost[j] != && lowcost[j] < minweight)
{
minweight = lowcost[j];
index = j;
}
j++;
}
lowcost[index] = ;//标记已经加到最小生成树中
Sum += minweight;
for(j = ; j <= v; j++)
{//判断没有加到最小生成树中的和比当前权值要小的点
if(lowcost[j] != && lowcost[j] > map[index][j])
{
lowcost[j] = map[index][j];
}
}
}
}
int main()
{
//freopen("1.txt", "r", stdin);
int n;
scanf("%d", &n);
while(n--)
{
Sum = ;
scanf("%d %d", &v, &e);
int t1, t2, t3;
memset(map, , sizeof(map));
for(int i = ; i <= v; i++)
{
map[i][i] = ;
}
for(int i= ; i < e; i++)
{
scanf("%d %d %d", &t1, &t2, &t3);
map[t1][t2] = t3;
map[t2][t1] = t3;
}
int mincost = INFINITY;
for(int i = ; i < v; i++)
{
scanf("%d", &t1);
mincost = min(mincost, t1);
}
mini_span_tree_prim();
printf("%d\n", Sum + mincost);
}
return ;
}

方法二(Kruskal):

#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
typedef struct Node{
int s;
int e;
int weight;
}Node;
const int MAX = + ;
const int INFINITY = ;
Node arr[MAX * ];
int father[MAX];
int sum;
int v, edges; bool cmp(Node a, Node b)
{
return a.weight < b.weight;
} int find(int f)
{
while(father[f] > )
f = father[f];
return f;
}
//生成最小生成树
void mini_span_tree_kruskai()
{
int n, m;
int cnt = ;
for(int i= ; i < edges; i++)
{
n = find(arr[i].s);
m = find(arr[i].e);
if(cnt == v - )//优化,如果找到了n-1条边,这时退出就行了
break;
if(n != m)//判断是否构成了环
{
father[m] = n;
sum += arr[i].weight;
cnt++;
}
}
} int main()
{
int n;
scanf("%d", &n);
while(n--)
{
memset(arr, , sizeof(arr));
memset(father, , sizeof(father));
sum = ;
scanf("%d %d", &v, &edges);
for(int i = ; i < edges; ++i)
{
scanf("%d %d %d", &arr[i].s, &arr[i].e, &arr[i].weight);
}
int mincost = INFINITY;
int t;
for(int i = ; i <= v; i++)
{
scanf("%d", &t);
mincost = min(mincost, t);
}
sort(arr, arr + edges, cmp);//排序
// for(int i = 0; i < edges; i++)
// printf("%d %d %d\n", arr[i].s, arr[i].e, arr[i].weight);
// printf("%d\n", mincost);
mini_span_tree_kruskai();
printf("%d\n", sum + mincost); }
return ;
}

最小生成树--->NYOJ-38 布线问题的更多相关文章

  1. NYOJ 38布线问题

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

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

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

  3. nyoj 38 布线问题

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

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

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

  5. nyoj 38 布线问题 Kruskal and Prim

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

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

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

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

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

  8. nyoj 38 简单并查集的应用&最小生成树

    #include<stdio.h> #include<stdlib.h> #define inf 0x3fffffff #define N 600 struct node { ...

  9. NYIST OJ 题目38 布线问题

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

  10. 最小生成树之kruskal方法实现 (java)

    今天是个阴天,下了点雨,work ......... 步骤:将所有边排序,然后不断从小到大加上边,这个过程最重要的是避免环的产生,此处用并查集.(nyoj 38) package 最小生成树; imp ...

随机推荐

  1. ecshop里Ajax.call()方法定义

    Ajax.call()在哪个文件中定义的? 在加载的js/transport.js文件里面. Ajax.cal()方法就是Transport.run()方法

  2. 手把手教你使用python复杂一点点的装饰器

    #只要@deco后面跟括号,都要 先传装饰器参数,返回 再传目标待装饰函数,返回 传目标函数的参数 #这个参数可以是类 def deco(arg):#装饰器的函数在这里传 print('0',arg) ...

  3. JavaScript 类型判断的那些事

    先准备几个变量 var a = "abcde."; var b = 222; var c= [1,2,3]; // 或者 new Array() var d = new Date( ...

  4. codeforces 235 B. Let's Play Osu!

    You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. F ...

  5. HTML 内嵌JS脚本、相关参考手册

    提供一个JS.HTML参考手册入口:http://www.w3school.com.cn/jsref/index.asp. JavaScript 最常用于图片操作.表单数据处理以及内容动态更新. &l ...

  6. Solr In Action 笔记(4) 之 SolrCloud分布式索引基础

    Solr In Action 笔记(4) 之 SolrCloud Index 基础 SolrCloud Index流程研究了两天,还是没有完全搞懂,先简单记下基础的知识,过几天再写个深入点的.先补充上 ...

  7. Substrings

    hdu1238:http://acm.hdu.edu.cn/showproblem.php?pid=1238 题意:给你n个串,求一个子串,这个子串在所有串中都出现,或者在逆串中出现.求最大的这个子串 ...

  8. 台积电16nm工艺为什么好过三星14nm

    最近,关于iPhone6s A9处理器版本的事情的话题很热,最后都闹到苹果不得不出来解释的地步,先不评判苹果一再强调的整机综合续航差2~3%的准确性,但是三星14nm工艺相比台积电16nm工艺较差已经 ...

  9. 让程序自动以管理员身份运行(用到了DuplicateToken,模拟管理员的身份,不可思议)

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  10. 替代 yunio , 推荐一个国外的云存储(同步盘) wuala(这个网站也挂了)——功能评测非常全面

    替代 yunio , 推荐一个国外的云存储(同步盘) wuala 话说自从云诺开始收费后,我的文件便再没同步或备份过,前天没事便找了一下,发现一个国外的网盘,注册送 5 G 空间(对我来说同步日常文件 ...