最小生成树(Prim算法)

news/2024/7/7 16:00:22

Prim算法和Dijkstra算法很像 复杂度是O(V^2)。用于解决稠密图的最小生成树问题。虽然可以优化到ElongE,但是这个时候还不如用kruskal算法来的简单
每次往生成树集合中加入离生成树距离最近的点,从一个点慢慢的扩展,最后得到所求的最小生成树。

#include <iostream>
#include <vector>
#define maxn 1005
using namespace std;

typedef long long ll

ll vis[maxn],cost[maxn]; 
//vis[i]表示i已经被用来扩展过了,cost[i]表示扩展出这个点的代价 
ll g[maxn][maxn];    //完全图时用prim,可以用二维数组表示图 

int main()
{
	int n,m,ans = 0;
	cin >> n >> m; 
	for( int i = 1 ; i <= n ; i++ )
	{
		cost[i] = 1e8;
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			g[i][j] = 1e18;
	}
	for( int i = 0 ; i < m ; i++ )   
	{
		ll x,y,v;
		cin >> x >> y >> v;
		g[x][y] = g[y][x] = v;
	}
	int begin;   				//从begin这个点来开始生成最小生成树   
	cost[1] = 0;
	for(int i = 0; i < n; i++ )    //遍历n次生成最小生成树
	{
		ll minx = 1e18;
		for (int j = 1; j <= n; j++)      //找最小花费时直接遍历这个cost数组,寻找下一个新的节点
		{
			if( !vis[j] && minx > cost[j] ) //找寻新的点 
			{
				minx = cost[j];
				begin = j;
			}
		}
		ans += minx;   //代价加上花费 
		vis[begin] = 1;     //vis置1表示该点已经使用过来更新相邻节点 
		for (int j = 1; j <= n; j++)      //遍历该点相邻的所有边更新权值
		{
			if( !vis[j] && cost[j] > g[begin][j] )
				cost[j] = g[begin][j];
		}
	}
	cout << ans << endl;
    return 0;
}


http://www.niftyadmin.cn/n/1037140.html

相关文章

6.1.5 GridView详解编辑

Android中的数据能够通过GridView类实现表格化展现&#xff0c;它也属于列表类型的控件&#xff0c;其继承关系如下&#xff1a; java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends android.widget.Adapter> ↳…

java 数组遍历

我们先来看一段代码 package made;public class index {public static void main(String args[]) {String[] arr {"小明","小风","小天","小兰","小东"};System.out.println(arr[0]);System.out.println(arr[1]);System.o…

E. Graph Coloring(二分图+背包dp)

题目 题意&#xff1a; 给定一张图&#xff0c;要求给每个点染色&#xff0c;颜色为1&#xff0c;2&#xff0c;3。要求1的个数为n1&#xff0c;2的个数为n2&#xff0c;3的个数为n3&#xff0c;并且对于任意两个相邻的点颜色的差的绝对值为1。     1≤n≤5000,0≤m≤105,…

6.1.6 Gallery结合案例详解

Gallery&#xff08;相册&#xff09;控件是个很不错的图片查看控件&#xff0c;屏幕中有一个图片列表&#xff0c;Gallery类的继承关系如下&#xff1a; java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends androi…

java 方法的基本概念及其方法的基本定义和使用

首先 我们需要了解方法是干什么的 比如你早上起床 刷牙 洗脸 这种每天都要做的事程序里也会有 比如 我们需要修改一个用户信息 首先我们要查询这个用户的信息 那么我们就可以把这个查询用户信息的过程 封装成一个方法 发放就是一块独立的代码块进行封装 然后要用到这段代码时直…

F. Kate and imperfection(思维)

题目 题意&#xff1a; 给定一个1…n的集合&#xff0c;要求分别求出长为2,3,4…n的子集&#xff0c;使得每个子集中任意两个数的gcd的最大值尽可能的小。     2≤n≤5⋅1052≤n≤5⋅10^52≤n≤5⋅105 分析&#xff1a; 这题就是一道思维题&#xff0c;经过灵光一闪后发现…

6.4 Android国际化和本地化

何谓国际化和本地化呢&#xff1f;就是在资源文件夹res内建立不同国家语言的文件&#xff0c;这些国家语言的文件命名是有规定的&#xff0c;具体参见表6-1。当用户设置手机的语言时&#xff0c;程序能根据用户选择的语言情况&#xff0c;而加载相对应的语言文件。用户感受到是…

7.2 LinearLayout布局详解

LinearLayout线性布局&#xff0c;线性布局是所有布局中最常用的&#xff0c;它可以让其中的子元素垂直或水平的方式排列&#xff08;通过排列方向的设置&#xff09;。通常复杂的布局都是在LinearLayout布局中嵌套而成的。 下面看一个LinearLayout的例子&#xff0c;这个例子中…