国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

求無向連通圖的最小生成樹 ← Prim算法

這篇具有很好參考價值的文章主要介紹了求無向連通圖的最小生成樹 ← Prim算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【題目描述】
給定一個?n?個點?m?條邊的
無向連通圖。圖中可能存在重邊自環(huán),邊權(quán)可能為負(fù)數(shù)
利用Prim算法求此種無向連通圖的最小生成樹的樹邊權(quán)重之和。

【輸入格式】
第一行包含兩個整數(shù) n 和 m。
接下來 m 行,每行包含三個整數(shù) u,v,w,表示點 u 和點 v 之間存在一條權(quán)值為 w 的邊。

【輸出格式】
共一行,輸出一個整數(shù),表示無向連通圖的最小生成樹的樹邊權(quán)重之和。

【數(shù)據(jù)范圍】
1≤n≤500,
1≤m≤10^5,
圖中涉及邊的邊權(quán)的絕對值均不超過 10000。


【算法代碼】
此代碼由兒子寫于初二暑假期間(2019年7月1日至7月10日間)。

#include <bits/stdc++.h>
using namespace std;

const int maxn=505;
int e[maxn][maxn],dis[maxn],st[maxn];

int inf=0x3f3f3f3f;
int cnt,sum;
int t1,t2,t3,tmp,zx;

int main() {
	int n,m; //n:Number of vertices, m:Number of edges
	cin>>n>>m;
	//Initialize the graph with an adjacency matrix
	for(int i=1; i<=n; i++) //n:Number of vertices
		for(int j=1; j<=n; j++)
			if(i==j) e[i][j]=0;
			else e[i][j]=inf;

	//Input edges and weights
	for(int i=1; i<=m; i++) { //m:Number of edges
		cin>>t1>>t2>>t3; //from,to,weight
		e[t1][t2]=min(e[t1][t2],t3);
		e[t2][t1]=min(e[t1][t2],t3);
	}

	//Initialize the dis array
	for(int i=1; i<=n; i++)
		dis[i]=e[1][i];

	st[1]=1;
	cnt++;
	while(cnt<n) {
		zx=inf;
		for(int i=1; i<=n; i++) {
			if(st[i]==0 && dis[i]<zx) {
				zx=dis[i];
				tmp=i;
			}
		}
		st[tmp]=1;
		cnt++;
		sum+=dis[tmp];

		for(int k=1; k<=n; k++) { //update dis array
			if(st[k]==0 && dis[k]>e[tmp][k])
				dis[k]=e[tmp][k];
		}
	}

	cout<<sum<<endl;
	return 0;
}

/*
in:
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2

out:
19
-------
in:
5 10
1 2 8
2 2 7
2 1 1
3 4 3
4 4 -10
1 3 -9
5 2 -4
3 1 0
1 4 8
4 4 7

out:
-9
*/


【算法拓展】
若給出的無向圖是連通圖或
非連通圖,且圖中可能存在重邊自環(huán),邊權(quán)可能為負(fù)數(shù)的情形,則可參考YXC大佬的經(jīng)典Prim算法代碼。

#include<iostream>
#include<cstring>
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=505;
int g[maxn][maxn],dis[maxn];
bool st[maxn];
int n,m,ans;

void prim() {
	memset(dis,inf,sizeof dis);
	for(int i=0; i<n; i++) {
		int t=-1;
		for(int j=1; j<=n; j++) {
			if(!st[j]&&(t==-1||dis[t]>dis[j]))
				t=j;
		}
		st[t]=true;
		if(i && dis[t]==inf) {
			cout<<"impossible"<<endl;
			return;
		}
		if(i) ans+=dis[t];
		for(int j=1; j<=n; j++) {
			dis[j]=min(dis[j],g[t][j]);
		}
	}
	cout<<ans<<endl;
}

int main() {
	cin>>n>>m;
	memset(g,inf,sizeof g);
	
	while(m--) {
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=g[b][a]=min(g[a][b],c);
	}
	
	prim();
	
	return 0;
}

/*
in:
10 20
5 3 -8
9 6 -1
1 3 -1
8 7 -6
5 4 6
7 7 -4
4 5 2
10 7 -4
2 1 9
7 10 10
4 5 6
8 7 -7
4 2 -3
9 6 6
5 1 0
7 6 5
5 4 -3
10 8 3
5 3 2
7 8 -7

out:
impossible
-------
in:
5 10
1 2 8
2 2 7
2 1 1
3 4 3
4 4 -10
1 3 -9
5 2 -4
3 1 0
1 4 8
4 4 7

out:
-9
*/





【參考文獻(xiàn)】
https://blog.csdn.net/Yu_iChan/article/details/127173866

https://www.acwing.com/problem/content/860/
https://www.acwing.com/blog/content/405/
https://www.acwing.com/solution/content/38312/
https://www.acwing.com/problem/content/solution/860/1/

?






?文章來源地址http://www.zghlxwxcb.cn/news/detail-466720.html

到了這里,關(guān)于求無向連通圖的最小生成樹 ← Prim算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 求無向圖的最小生成樹——Kruskal算法(超詳細(xì))【并查集,python實現(xiàn)】

    求無向圖的最小生成樹——Kruskal算法(超詳細(xì))【并查集,python實現(xiàn)】

    以如下無向圖為例,求最小生成樹及其權(quán)值。 補(bǔ)充知識點: 最小生成樹(不官方的解釋):包含所有節(jié)點,保持整個圖連通,所有邊權(quán)值之和最小。 1、補(bǔ)充在前 (1)圖的存儲 采用二維列表存儲(點,點,邊的權(quán)值) (2)頂點轉(zhuǎn)換 為了便于計算,將字母A ~ G用數(shù)字0 ~ 6代

    2024年02月04日
    瀏覽(25)
  • 【算法導(dǎo)論】圖論(圖的基本概念,圖上的深度優(yōu)先搜索(DFS),廣度優(yōu)先搜索(BFS),最小生成樹(MST)及Prim,Kruskal算法)

    【算法導(dǎo)論】圖論(圖的基本概念,圖上的深度優(yōu)先搜索(DFS),廣度優(yōu)先搜索(BFS),最小生成樹(MST)及Prim,Kruskal算法)

    圖(Graph)是一種包含節(jié)點與節(jié)點的邊的集合,記作G=(V,E),V是節(jié)點的集合,E是邊的集合。 有向圖 一個有向圖G=(V,E),E中每個元素是V上的一個二值關(guān)系:一條從a出發(fā)的連向b的邊e可以記作一個 有序 對e = (a,b) 。 無向圖 一個無向圖G=(V,E),E的每個元素e可以表示V上的一個 無序 對,記

    2024年02月03日
    瀏覽(28)
  • 【學(xué)習(xí)筆記】無向圖的連通性

    定義: 在無向圖連通圖中,若把點 (x) 刪去后整個圖就不連通了,則 (x) 為割點(割頂)。 樸素方法: 每次刪去一個點,然后判斷圖是否連通,時間復(fù)雜度為 (O(n(n+m))) 。 Tarjan 算法: (dfn_x) : (x) 被 dfs 到的時間戳 (low_x) :在 (x) 及以后被搜索的所有節(jié)點的 (low) 值

    2024年02月15日
    瀏覽(24)
  • 考研算法復(fù)試刷題19天:Prim算法求最小生成樹 【prim,最小生成樹】

    考研算法復(fù)試刷題19天:Prim算法求最小生成樹 【prim,最小生成樹】

    參考博客:圖解:什么是最小生成樹? - 知乎 (zhihu.com)? 總結(jié)下來的過程就是,一張圖,我們將他化為樹的形式,也就是生成樹。那么最小生成樹有是啥呢? 所謂一個?帶權(quán)圖?的最小生成樹,就是原圖中邊的權(quán)值最小的生成樹?,所謂最小是指邊的權(quán)值之和小于或者等于其它

    2024年02月07日
    瀏覽(23)
  • 貪心算法:最小生成樹Prim算法

    貪心算法:最小生成樹Prim算法

    ?????作者簡介:一位喜歡寫作,計科專業(yè)大二菜鳥 ??個人主頁:starry陸離 ??首發(fā)日期:2022年5月31日星期二 ??上期文章:動態(tài)規(guī)劃:多重背包問題 ??訂閱專欄:算法分析與設(shè)計 如果文章有幫到你的話記得點贊??+收藏??支持一下哦 這是大一暑假的c筆記,再一次寫pri

    2024年02月01日
    瀏覽(24)
  • 最小生成樹—Prim算法

    最小生成樹—Prim算法

    我們要討論的問題是如何在一個 無向圖 中找到它的最小生成樹,雖然這個問題對有向圖也有意義,但是處理起來更麻煩。 一個無向圖 G?的最小生成樹就是連接 G 上所有頂點的邊構(gòu)成的樹,且這些邊的總權(quán)值最低。當(dāng)且僅當(dāng)圖是 連通的 才有最小生成樹。 在無向圖的最小生成

    2024年02月09日
    瀏覽(29)
  • Prim算法實現(xiàn)最小生成樹

    Prim算法實現(xiàn)最小生成樹

    例如:要在n個城市之間鋪設(shè)光纜,主要目標(biāo)是要使這n個城市的任意兩個之間都可以通信,但鋪設(shè)光纜的費用很高,且各個城市之間鋪設(shè)光纜的費用不同,因此另一個目標(biāo)是要使鋪設(shè)光纜的總費用最低。這就需要找到帶權(quán)的最小生成樹。 將圖中所有頂點分為兩類:樹頂點(已

    2024年02月11日
    瀏覽(27)
  • Prim算法求最小生成樹

    Prim算法求最小生成樹

    給定一張邊帶無權(quán)的無向圖G = (V, E), n = |V|, m = |E|。由V中全部n個頂點和E中n - 1條邊構(gòu)成的無向連通子圖被稱為G的一課生成樹。邊的權(quán)值之和最小的生成樹被稱為無向圖的最小生成樹。 Prim算法總是維護(hù)最小生成樹的一部分。最初,Prim算法僅確定1號節(jié)點屬于最小生成樹

    2024年02月12日
    瀏覽(22)
  • 最小生成樹——prim算法實現(xiàn)

    最小生成樹——prim算法實現(xiàn)

    N個城市之間需要鋪設(shè)一張交通網(wǎng),使任意兩個城市間都有交通路線直達(dá),現(xiàn)已知各個城市之間鋪設(shè)道路的經(jīng)濟(jì)成本,問該如何求算鋪網(wǎng)的最低經(jīng)濟(jì)成本?為求算最低經(jīng)濟(jì)成本,可以假設(shè)N個城市就是連通網(wǎng)G的N個頂點,而求算最低成本問題可以轉(zhuǎn)化為在N個城市間找到N-1條邊,

    2024年02月08日
    瀏覽(20)
  • 最小生成樹(Prim算法,Kruskal算法)

    最小生成樹(Prim算法,Kruskal算法)

    (1)生成樹: 如果在一個無向連通圖不包含回路(連通圖中不存在環(huán)),則為一個樹 (2)最小生成樹(minimal spanning tree): 在一個圖所有生成樹中,代價最小的生成樹稱為最小生成樹 (3)生成樹的代價: 在一個無向連通網(wǎng)中,生成樹各邊的權(quán)值之和稱為該生成樹的代價

    2024年02月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包