`

【最小生成树+Prim】杭电 hdu 1102 Constructing Roads

阅读更多

/* 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 ;
}

0
1
分享到:
评论

相关推荐

    代码 最小生成树Prim算法代码

    代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小...

    最小生成树_Prim算法实现C++

    最小生成树_Prim算法实现C++ 在计算机科学中,Prim算法是一种常用的最小生成树算法,它可以用于解决无向图的最小生成树问题。 Prim算法的主要思想是,从某个起始点开始,逐步添加边,直到所有顶点都被连接。 在...

    最小生成树(Prim算法)

    使用Prim算法编写的最小生成树(C语言),为更好地学习数据结构

    最小生成树,Prim算法的使用(邻接矩阵实现).txt

    ### 最小生成树与Prim算法(邻接矩阵实现) #### 一、最小生成树概念 在图论中,一个无向图的生成树是该图的一个无环子图,且包含图中的所有顶点。若该图是有权图,则生成树上的边也带有相应的权重。最小生成树...

    图的最小生成树PRIM算法课程设计

    图的最小生成树PRIM算法课程设计 本课程设计的主要目的是实现图的最小生成树,使用普里姆算法来实现。普里姆算法是一种常用的图算法,用于寻找无向图中的最小生成树。该算法通过逐个遍历图中的顶点,记录权值最小的...

    基于MATLAB的最小生成树Prim算法 源代码程序.rar

    在本压缩包中,提供了基于MATLAB实现的Prim算法源代码,这是一种求解加权连通图最小生成树的经典算法。 Prim算法由捷克数学家Vojtěch Jarník于1930年提出,并由美国计算机科学家Robert C. Prim在1957年再次独立...

    最小生成树之prim

    最小生成树之prim

    最小生成树_prim_数据结构_课设_最小生成树_

    问题描述:给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。基本要求:1、城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义...

    最小生成树+设计文档

    1. **Prim算法**:Prim算法是一种贪心算法,用于找到加权无向图的最小生成树。它从图中的一个顶点开始,逐步将当前生成树与图中其他顶点连接,每次选择与当前生成树连接且权重最小的边。这个过程一直持续到所有顶点...

    最小生成树 prim算法和Kruskal算法实现

    prim算法 Kruskal算法分别实现最小生成树

    最小生成树-Prim算法

    利用c++编程实现,最小生成树的Prim算法,

    实现构造最小生成树的Prim算法

    Prim算法是一种有效的解决最小生成树问题的方法,它由捷克数学家Vojtěch Jarník在1930年提出,并由美国计算机科学家Robert C. Prim在1957年独立发现。Prim算法主要用于加权无向图,目标是从图中的一个顶点开始,...

    用Prim和Kruskal算法构造最小生成树

    ### 使用Prim和Kruskal算法构建最小生成树 在图论中,最小生成树(Minimum Spanning Tree, MST)是一个非常重要的概念。对于一个连通的无向图来说,如果存在一个子图,它包含原图的所有顶点,并且这些顶点通过边...

    cpp-图论算法最小生成树Prim算法和Kruskal算法C实现

    本文将详细介绍两种经典算法来解决最小生成树问题:Prim算法和Kruskal算法,并以C语言实现为例进行讲解。 ### Prim算法 Prim算法是一种贪心算法,其基本思想是从一个初始节点开始,逐步添加最短的边,直到连接到...

    最小生成树prim算法

    Prim算法是一种用于寻找加权图最小生成树的经典算法,由捷克数学家Vojtěch Jarník在1930年提出,并由美国计算机科学家Robert C. Prim在1957年再次独立发现。 Prim算法的基本思想是逐步构建最小生成树,每次从已有...

    最小生成树 普列姆算法 prim matlab

    最小生成树的经典算法。我在代码中加入了文字解释。并以算法导论第二版书中例子为例,得到了相同结果。代码很完整,也有结果显示环节。

    杭电HDU ACM培训课件

    1. **基础算法**:这是ACM编程的基础,包括排序(快速排序、归并排序、堆排序等)、搜索(二分查找、深度优先搜索、广度优先搜索)、图论(最短路径算法如Dijkstra和Floyd-Warshall,最小生成树如Prim和Kruskal)等...

    最小生成树Prim算法

    最小生成树是图论中的一个重要概念,用于寻找一个无向加权图的边集合,这些边连接了图中的所有顶点,且总权重尽可能小。Prim算法是解决这一问题的有效方法之一,由捷克数学家Vojtěch Jarník在1930年提出,后由...

    最小生成树PRIM算法

    ### 最小生成树PRIM算法知识点 #### PRIM算法简介 PRIM算法是一种用于寻找加权无向图的最小生成树(Minimum Spanning Tree, MST)的经典算法。该算法由捷克数学家Vojtěch Jarník于1930年首次提出,并在1957年被美国...

    基于matlab的最小生成树prim算法

    基于matlab的最小生成树的prim算法,有详细的解释,可直接运行

Global site tag (gtag.js) - Google Analytics