/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2012 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=1102
Name : 1102 Constructing Roads
Date : Tuesday, February 7, 2012
Time Stage : half an hour
Result:
5325772 2012-02-07 15:30:46 Accepted 1102
15MS 212K 2023 B
C++ pyy
5325749 2012-02-07 15:27:05 Time Limit Exceeded 1102
1000MS 184K 2016 B
C++ pyy
Test Data :
Review :
//----------------------------------------------------------------------------*/
#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std ;
#define MEM(a, v) memset (a, v, sizeof (a)) // a for address, v for value
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
#define INF (0x3f3f3f3f)
#define MAXN (103)
#define MAXE (MAXN*(MAXN-1)/2)
#define DEBUG /##/
int n, q ;
int map[MAXN][MAXN], dist[MAXN], used[MAXN] ;
int Prim()
{
int i, j, sum, iMinPath, MinPath ;
// 一开始把1放入集合A中,然后求集合A到集合B各点的距离
for (i = 1 ; i <= n ; ++i)
dist[i] = map[1][i] ;
MEM(used, 0) ;
sum = 0 ;
used[1] = true ; // 标记集合A中的点
for (i = 1 ; i <= n-1 ; ++i)
{
MinPath = INF ;
// 求出集合A到集合B中各点距离的最小值
for (j = 1 ; j <= n ; ++j)
if (!used[j] && dist[j] < MinPath)
{
MinPath = dist[j] ;
iMinPath = j ;
}
// 将集合B中的点并入集合A中
used[iMinPath] = true ;
// 新点加入意味着新的路径产生了
sum += MinPath ;
// 由于新点的加入,集合A到集合B中各点的距离可能会变化,
// 所以要及时更新
for (j = 1 ; j <= n ; ++j)
if (!used[j] && dist[j] > map[iMinPath][j])
dist[j] = map[iMinPath][j] ;
}
return sum ;
}
int main()
{
int i, j ;
int x, y ;
while (scanf("%d", &n) != EOF) // 一开始忘了判断 EOF 了,= =!
{
MEM (map, INF) ;
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= n ; ++j)
scanf ("%d", &map[i][j]) ;
scanf ("%d", &q) ;
for (i = 1 ; i <= q ; ++i)
{
scanf ("%d%d", &x, &y) ;
map[x][y] = map[y][x] = 0 ; // 已建成的路就不用再建了
}
printf ("%d\n", Prim()) ;
}
return 0 ;
}
分享到:
相关推荐
代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小...
最小生成树_Prim算法实现C++ 在计算机科学中,Prim算法是一种常用的最小生成树算法,它可以用于解决无向图的最小生成树问题。 Prim算法的主要思想是,从某个起始点开始,逐步添加边,直到所有顶点都被连接。 在...
使用Prim算法编写的最小生成树(C语言),为更好地学习数据结构
### 最小生成树与Prim算法(邻接矩阵实现) #### 一、最小生成树概念 在图论中,一个无向图的生成树是该图的一个无环子图,且包含图中的所有顶点。若该图是有权图,则生成树上的边也带有相应的权重。最小生成树...
图的最小生成树PRIM算法课程设计 本课程设计的主要目的是实现图的最小生成树,使用普里姆算法来实现。普里姆算法是一种常用的图算法,用于寻找无向图中的最小生成树。该算法通过逐个遍历图中的顶点,记录权值最小的...
在本压缩包中,提供了基于MATLAB实现的Prim算法源代码,这是一种求解加权连通图最小生成树的经典算法。 Prim算法由捷克数学家Vojtěch Jarník于1930年提出,并由美国计算机科学家Robert C. Prim在1957年再次独立...
最小生成树之prim
问题描述:给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。基本要求:1、城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义...
1. **Prim算法**:Prim算法是一种贪心算法,用于找到加权无向图的最小生成树。它从图中的一个顶点开始,逐步将当前生成树与图中其他顶点连接,每次选择与当前生成树连接且权重最小的边。这个过程一直持续到所有顶点...
prim算法 Kruskal算法分别实现最小生成树
利用c++编程实现,最小生成树的Prim算法,
Prim算法是一种有效的解决最小生成树问题的方法,它由捷克数学家Vojtěch Jarník在1930年提出,并由美国计算机科学家Robert C. Prim在1957年独立发现。Prim算法主要用于加权无向图,目标是从图中的一个顶点开始,...
### 使用Prim和Kruskal算法构建最小生成树 在图论中,最小生成树(Minimum Spanning Tree, MST)是一个非常重要的概念。对于一个连通的无向图来说,如果存在一个子图,它包含原图的所有顶点,并且这些顶点通过边...
本文将详细介绍两种经典算法来解决最小生成树问题:Prim算法和Kruskal算法,并以C语言实现为例进行讲解。 ### Prim算法 Prim算法是一种贪心算法,其基本思想是从一个初始节点开始,逐步添加最短的边,直到连接到...
Prim算法是一种用于寻找加权图最小生成树的经典算法,由捷克数学家Vojtěch Jarník在1930年提出,并由美国计算机科学家Robert C. Prim在1957年再次独立发现。 Prim算法的基本思想是逐步构建最小生成树,每次从已有...
最小生成树的经典算法。我在代码中加入了文字解释。并以算法导论第二版书中例子为例,得到了相同结果。代码很完整,也有结果显示环节。
1. **基础算法**:这是ACM编程的基础,包括排序(快速排序、归并排序、堆排序等)、搜索(二分查找、深度优先搜索、广度优先搜索)、图论(最短路径算法如Dijkstra和Floyd-Warshall,最小生成树如Prim和Kruskal)等...
最小生成树是图论中的一个重要概念,用于寻找一个无向加权图的边集合,这些边连接了图中的所有顶点,且总权重尽可能小。Prim算法是解决这一问题的有效方法之一,由捷克数学家Vojtěch Jarník在1930年提出,后由...
### 最小生成树PRIM算法知识点 #### PRIM算法简介 PRIM算法是一种用于寻找加权无向图的最小生成树(Minimum Spanning Tree, MST)的经典算法。该算法由捷克数学家Vojtěch Jarník于1930年首次提出,并在1957年被美国...
基于matlab的最小生成树的prim算法,有详细的解释,可直接运行