最小代价生成树

#include<iostream>
using namespace std;
const int Max = 100;
int p[Max][Max];
const int maxCost = 99;
int lowcost[Max];
int nearest[Max];
bool mark[Max];
void Prime(int k,int n)
{
	memset(lowcost, 99, sizeof(lowcost));
	memset(nearest, -1, sizeof(nearest));
	memset(mark, false, sizeof(mark));
	nearest[k] = k;
	lowcost[k] = 0;
	mark[k] = true;
	//k is the the point you have added the set
	for (int i = 0; i < n; i++)
	{
		//update lowcost and nearest
		for (int j = 0; j < n; j++)
		{
			if (p[k][j] != 0 && !mark[j] && lowcost[j] > p[k][j])
			{
				lowcost[j] = p[k][j];
				nearest[j] = k;
			}
		}
		//find the min lowcost
		int min = maxCost;
		for (int j = 0; j < n; j++)
		{
			if (!mark[j] && min > lowcost[j])
			{
				min = lowcost[j];
				k = j;
			}
		}
		mark[k] = true;
	}

}

int main()
{
	freopen("sample_input.txt","r",stdin);
	int vertex, edge;
	cin >> edge >> vertex;
	int u, v, cost;
	for (int i = 0; i < vertex; i++)
	{
		cin >> u >> v >> cost;
		p[u][v] = cost;
		p[v][u] = cost;
	}
	Prime(0, edge);
	return 0;
}
时间: 2024-10-03 14:03:18

最小代价生成树的相关文章

实验六 最小代价生成树

实验名称:最小代价生成树 实验章节:算法设计与分析第6章 实验目的: 掌握贪心算法解决问题的思想和一般过程,           学会使用普里姆算法解决实际问题. 提交形式: 所有作业的原程序和可执行程序(即cpp文件和exe文件) 纸质实验报告(格式和内容请参阅末页) 实验内容 完善下列程序,并回答问题. 1 #include<iostream.h> 2 3 #define G_NODE_NUM 6 //结点个数 4 5 #define INFTY 65535 6 7 template<

TZOJ 5471: 数据结构实验--图的最小代价生成树

题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附的两个顶点,第3个整数是边的权值. 所有值不超过20. 输出 请使用prim算法生成一棵生成树,并输出为生成树的各条边及其权值.格式见样例. 样例输入 5 71 2 11 3 12 3 42 4 22 5 13 4 54 5 6 样例输出 1 2 11 3 12 5 12 4 2 PS:太惭愧了,写

最小代价生成树(数据结构)

1 //最小代价生成树 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中 3 void Prim(MGraph g,int v0,int &sum) { 4 int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点 5 int min,k; 6 v=v0; 7 for(int i=0; i<g.n; i++) { 8 lowcost[i]=g.edges[v0][i]

[数据结构] 最小(代价)生成树

在说明最小生成树之前,先重温一下其他的几个概念. 连通图:任意两个顶点都有路径相通的无向图,称为连通图.(注意不是边,而是路径) 强连通图:任意两个顶点都有路径相通的有向图,称为强连通图. 网:图的边具有一定的意义,每条边都对应着一个数据,称为权,这种图被称为网. 连通网,同理. 最小生成树 生成树:从一个连通图中拆出一棵连通子图,它包含了所有的顶点,但只保留了足以构成一棵树的边(N-1条边,N为顶点个数). 最小生成树:对于连通网而言的,所有边的代价之和最小(权的总和最小)的生成树,就是最小生

1130. 叶值的最小代价生成树

1.dp 1 int mctFromLeafValues(vector<int>& arr) { 2 int len = arr.size(); 3 vector<vector<int>> rmq(len, vector<int>(len, 0)); 4 for (int i = 0; i < len; i++) 5 rmq[i][0] = arr[i]; 6 for (int j = 1; (1<<j)<len ; j++)

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

POJ 1861 ——Network——————【最小瓶颈生成树】

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15268   Accepted: 5987   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

BZOJ2180: 最小直径生成树

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2180 2180: 最小直径生成树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 195  Solved: 93[Submit][Status][Discuss] Description 输入一个无向图G=(V,E),W(a,b)表示边(a,b)之间的长度,求一棵生成树T,使得T的直径最小.树的直径即树的最长链,即树上距离最远的两点之间路径

HDU5697 刷题计划 dp+最小乘积生成树

分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog.csdn.net/u013849646/article/details/51524748 注:这里用的最小乘积生成树的思想,和dp结合 每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树 这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优 #include