hihocoder(1097) 最小生成树Prim

图论一直是自己算法中最最最柔弱的部分,主要是,当年数据结构的课程,后面就去打酱油了,后来时间又都花在了电赛上,平时用的相关部又少,这一部分就更弱了,总是懒得捡起来,但是现在可是没退路了,开始好好复习这一部分。

Prim算法是求解无向图最小生成树的经典算法,和Dijkstra算法类似,但是Prim算法每次获取一个新的顶点后,都有一个聚合的过程,而Dijkstra没有,并且Dijkstra的对象是有向图的单源最短路径,所以这两个算法起始本质上是不同的,然而他们的思想是一致的:贪心

刚好借着hihocoder的这个题实现一下这个算法,刚开始的时候拿STL的set和vector做的,但是由于没有用辅助数组,也没有用到聚合的思想,于是傻傻的写了个O(n3)的算法,直接超时了,用例测时,3300多ms,后来醒悟过来,明明记得Prim是O(n2)的算法,于是果断丢掉set和vector,重新试实现了下,添加辅助数组low。

总结:

Prim算法时间复杂度O(n2),适合于边比较密集的Graph。另外一个算法Kruskal的算法O(eloge),适合于边比较稀疏的情况。

Impl:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <climits>
 5
 6 using namespace std;
 7
 8 int w[1010][10010];
 9 int low[10010];
10 bool visited[10010];
11 int n;
12
13 int prim()
14 {
15     int pos,min,res = 0;
16     int left = n;
17
18     //选取任意点作为开始节点,初始化辅助数组
19     visited[0] = true; pos = 0;
20     for (int i = 0; i < n; ++i){
21         if (i != pos) low[i] = w[pos][i];
22     }
23
24     for (int i = 1; i < n; ++i)
25     {
26         min = INT_MAX;
27         for (int j = 0; j < n; ++j) //找出收缩后的最优节点
28             if (!visited[j] && min>low[j])
29                 min = low[j], pos = j;
30
31         res += min;
32         visited[pos] = true;
33
34         for (int j = 0; j < n; ++j) //一个收缩的过程,刷新辅助数组
35             if (!visited[j] && low[j]>w[pos][j])
36                 low[j] = w[pos][j];
37     }
38
39     return res;
40 }
41
42
43 int main()
44 {
45     scanf("%d", &n);
46     for (int i = 0; i < n; ++i)
47         for (int j = 0; j < n; ++j)
48             scanf("%d", &w[i][j]);
49     memset(visited, 0, sizeof(visited));
50
51     printf("%d\n", prim());
52
53     return 0;
54 }

时间: 2024-10-28 14:30:27

hihocoder(1097) 最小生成树Prim的相关文章

hihoCoder #1097 最小生成树之Prim算法

原题网址,http://hihocoder.com/problemset/problem/1097 #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但 是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就 可以使得任意两座城市都可以通过所建

hihoCoder#1097 最小生成树一&#183;Prim算法

原题地址 Prime算法,每次挑选一个距离原点最近的节点,然后收缩(visited为true) 跟Dijkstra真的很像 代码: 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 #define MAX_POINT 1024 7 8 int N; 9 int g[MAX_POINT][MAX_POINT]; 10 bool visited[MAX_POINT]; 11 12 int pr

Hihocoder 之 #1097 : 最小生成树一&#183;Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)

#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过

hihocoer - 1097(最小生成树&#183;Prim算法)

题目链接: http://hihocoder.com/problemset/problem/1097 题目: #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通

HihoCoder 1097 Prim算法

1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来--小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这

poj1861 最小生成树 prim &amp; kruskal

// poj1861 最小生成树 prim & kruskal // // 一个水题,为的只是回味一下模板,日后好有个照应不是 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <iostream> using namespace std; const int MAX_N = 1008; const int INF =

nyist oj 38 布线问题 (最小生成树 prim)

布线问题 时间限制: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).(哪两栋楼间如果没有指明花费

最小生成树--prim算法

一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值最低,因此,最小生成树存在的充分必要条件为图G是连通的,简单点说如下: 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 上图的红色的边加上顶点就是原图的

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug