#include <stdio.h>
#include <string.h>
#define DEBUG
#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__)
#else
#define debug(...)
#endif
#define N 100
#define MAX_INT 20000000
int graph[N][N];
int dist[N]; /* dist[i]表示顶点i距离已加入集合的最小距离, 如果dist[i]变为-1, 表示顶点i已加入集合 */
int n;
int prim(int u)
{
int i, p, min, total_cost, min_edge;
for (i = 0; i < n; i++) {
dist[i] = MAX_INT;
}
p = u; /* p为选种加入集合的点,初始时为u */
total_cost = 0;
for (;;) {
min = MAX_INT;
min_edge = -1;
debug("顶点%d加入集合\n", p);
dist[p] = -1;
/* 把顶点p加入集合后, 遍历所有未加入集合的顶点, 更新它们的距离, 同时找出距离最小的顶点 */
for (i = 0; i < n; i++) {
if (dist[i] >= 0) { /* 顶点i未加入集合 */
if (graph[p][i] > 0 && graph[p][i] < dist[i]) {
dist[i] = graph[p][i];
debug("更新顶点%d的距离为%d\n", i, dist[i]);
}
if (dist[i] < min) {
min = dist[i];
min_edge = i;
}
}
}
if (min_edge == -1) break;
debug("距离最小的顶点为%d, 长度为%d\n", min_edge, min);
p = min_edge;
total_cost += min;
}
return total_cost;
}
int main()
{
int i, j;
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
printf("%d\n", prim(0));
}
return 0;
}
分享到:
相关推荐
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
标题中的“POJ 1789 最小生成树之prim算法”指的是一个在线编程竞赛题目,来源于普林斯顿开放在线课程(POJ)平台。该题目要求参赛者实现Prim算法,这是一种解决图论问题中寻找最小生成树的经典算法。最小生成树是在...
【标签】"POJ 1258 Agri-Net Prim" 说明了这个题目的编号是POJ1258,题目背景可能是与农业网络(Agri-Net)相关的,而核心算法是Prim算法。Prim算法是一种在加权无向图中寻找最小生成树的算法,用于找到连接所有顶点...
Prim算法可以帮助找到连接所有城市的最短路径总和,即最小生成树。 总的来说,这个压缩包提供了对POJ2485题目的完整解答,通过Prim算法解决了公路网络优化的问题,并附有详细的代码和解题思路。对于学习图论和算法...
标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...
Prim算法是一种贪心算法,其基本思想是从某个顶点出发,逐步选择与当前已构建的生成树相连接的边中权重最小的边加入生成树中,直到生成树包含图中的所有顶点为止。 - **初始化**:选择一个顶点\( v \)作为起始顶点...
1. POJ2485 和 POJ1258 题目都是典型的最小生成树问题,要求在给定的城市或农场之间构建网络,使得总距离最小。这两种情况都可以使用 Prim 算法或 Kruskal 算法来解决。Prim 算法从一个顶点开始,逐步添加边,每次...
给定代码片段中使用了Prim算法来计算每个连通分量内的最小生成树,并通过扩展Prim算法(`extend_degree()`函数)来寻找每个连通分量中到根节点的最佳边,以此来构建满足度数限制的生成树。 #### 知识点三:代码分析...
【Prim算法】Prim算法是一种贪心策略,用于解决图论中的最小生成树问题。它从一个初始顶点开始,逐步添加边,每次选择与当前树连接且权重最小的边,直到所有顶点都被包含在内。Prim算法有多种实现方式,如优先队列...
Prim算法是一种用于求解图中最小生成树的算法。在图论中,一个连通图的最小生成树是一棵树,它包含图中的所有顶点,并且所有边的权重之和尽可能小。Prim算法是从一个顶点开始,逐步添加边,直到包含所有顶点,每次...
1. **函数mst(int ss)**:输入参数ss代表生成树的起点,该函数通过Prim算法实现最小生成树的构建。 - 初始化距离数组`dis[]`,设置起点距离为0,其余节点距离为无穷大。 - 使用循环找到未加入生成树的最近节点,并...
* 最小生成树算法:最小生成树算法是指计算图的最小生成树的算法,如 prim、kruskal。 * 拓扑排序:拓扑排序是指计算图的拓扑排序的算法,如 poj1094。 * 二分图的最大匹配:二分图的最大匹配是指计算二分图的最大...
先利用prim算法求出最小生成树,然后通过往MST里加边来判断新生成的最小生成树是否具有最小的权值,POJ上The Unique MST(1679)题是要求判断最小生成树是否唯一,此题其实根本不用这样做,但是为了练习球次小生成树...
2. **最小生成树**:Prim算法和Kruskal算法是两种常见的构建最小生成树的方法。Prim算法从一个顶点开始逐步添加边,而Kruskal算法则是按边的权重从小到大加入,确保不形成环路。 3. **拓扑排序**:对于有向无环图...
prim算法是一种贪心算法,用于计算图的最小生成树。Stoer-Wagner 算法将prim算法应用于计算图的最小割。 Stoer-Wagner 算法的实现可以分为以下步骤: 1. 初始化图的邻接矩阵mat和deleted数组,deleted数组用于标记...
然后,Prim算法每次从尚未加入最小生成树的节点中选择距离起点最近的一个,连接到树中,更新其他节点的距离。重复此过程,直至所有节点都被包含在内。 在提交的代码文件“POJ3026-Borg Maze【BFS+Prim】.cpp”中,...
1. **Prim算法**:Prim算法是一种贪心策略,从一个初始顶点开始,逐步添加最便宜的边,使得每次添加的新边都连接到已有的最小生成树。这个过程持续到所有顶点都被包含在内。Prim算法在稠密图中效率较高,因为它每次...
常见的求解最小生成树的算法有Prim算法和Kruskal算法。 1. **Prim算法**:从一个顶点开始,逐步添加边,每次添加的边连接两个不同的连通分量,并且具有当前未加入树的边中的最小权重,直到连接所有顶点为止。 2. *...
6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树问题(Prim和Kruskal算法)。 7. **字符串处理**:如KMP算法、Rabin-Karp算法、...
* 最小生成树算法:prim、kruskal、POJ1789、POJ2485、POJ1258、POJ3026 * 拓扑排序:POJ1094 * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002...