財神娛樂首存即享優惠回饋唷~詳情請進👉

【數據布局】 最小天生樹(四)——行使krus小鋼珠秘訣kal算法弄定規題×3+

  在這一專輯(最小天生樹)中的上一期講到了prim算法,然則prim算法比較難明,為了不望不懂,就先用kruskal算法寫題吧,上面將會將三道例題,加一道變形,和一道洪水題,水到不消高等數據布局,建樹,繪圖,最短路徑甚么的,齊備不必要。廢話不多說,間接望題:

例題精講

T1:

1348:【例4-9】城市公交網設置裝備擺設成績

時間限定: 1000 ms ??? ??? 內存限定: 65536 KB
提交數: 2094 ??? 經由過程數: 650?

【標題描寫】

有一張城市輿圖,圖中的極點為城市,無向邊代表兩個城市間的連通瓜葛,邊上的權為在這兩個城市之間構筑高速公路的造價,研究后發明,這個輿圖有一個特色,即任一對城市都是連通的。目前的成績是,要構筑多少高速公路把一切城市接洽起來,問若何設計可使得工程的總造價至少?

【輸出】

n(城市數,1<≤n≤100)

e(邊數)

如下e行,每行3個數i,j,wiji,j,wij,透露表現在城市i,j之間構筑高速公路的造價。

【輸入】

n-1行,每舉動兩個城市的序號,注解這兩個城市間建一條高速公路。

【輸出樣例】

5 8
1 2 2
2 5 9
5 4 7
4 1 10
1 3 12
4 3 6
5 3 3
2 3 8

【輸入樣例】

1  2
2  3
3  4
3  5

  望完以后有思緒嗎?這題一定簡略,這是一道純模板題,只無非輸入有點貧苦。總之,先往返憶一下kruskal算法道理:起首必要找到圖中的一條最短的邊,若是它不與最小天生樹聚攏中的其余邊發生歸路,那末就參加這條邊至聚攏中,前次小編寫的很輕率,只是一個偽代碼(偽代碼以下),此次的標題小編會寫成正式代碼;接著,輸入又是一個貧苦事,這就必要闡發樣例了,先好悅目一望樣例,你發明了嗎?左側的數總小于右側的數,上面的第一個數總比下面的第一個數大,當然,若是第一個數同樣大,那末就按第二個數從小到大排序。根據這個紀律,接著,就來望一望AC代碼吧。

 1 //假定MST[]是最小天生樹的聚攏,cnt透露表現是存入聚攏的邊數 
 2 while(cnt<n-1)//共有n-1條邊
 3 {
 4     在圖中找出最短的一條邊;
 5     if(增添這條邊不發生歸路) 
 6     {
 7         參加MST聚攏;
 8         cnt++; 
 9     } 偏財運占卜
10 }

//偽代碼

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,e,a[1000],k,p,q;
 8 struct tree{
 9     int start;
10     int end;
11     int cost;
12 };
13 tree T[1000];
14 bool operator < (const tree& a,const tree& b)//按cost的值從小到大排序
15 {
16     return a.cost>b.cost;
17 }
18 bool cmp(tree a,tree b)//這個排序方式便是下面所說的瓜葛
19 {
20     if(a.start==b.start)
21     return a.end<b.end;
22     return a.start<b.start;
23 }
24 priority_queue<tree>t;
25 inline int find(int x)//并查集 26 {
27     if(x==a[x]) return x;
28     else return a[x]=find(a[x]);
29 }
30 void kruskal()
31 {
32     for(int i=1;i<=n;i++)//并查集初始化
33     a[i]=i;
34     tree large;
35   運 彩 致富 PTT  for(int i=1;i<=e;i++)
36     {
37         large=t.top();//獵取最小邊
38         t.pop();
39         if(find(large.start)!=find(large.end))//若是不發生歸路
40         {
41             p=find(large.start);q=find(large.end);
42             a[q]=p;
43             T[++k]=large;//參加到聚攏中
44         }
45     }
46     sort(T+1,T+k+1,cmp);//按紀律排序,不然次序紕謬
47     for(int i=1;i<=k;i++)
48     printf("大眾%d %d \n"大眾,T[i].start,T[i].end);
49 }
50 int main()
51 {
52     tre玩運彩即時比分e s;
53     scanf("大眾%d%d公眾,&n,&e);
54     for(int i=1;i<=e;i++)
55     {
56         scanf("大眾%d%d%d公眾,&s.start,&s.end,&s.cost);
57         if(s.start>s.end) swap(s.start,s.end);
58         t.push(s);
59     }
60     kruskal();
61     return 0;
62 }

//AC代碼

  這個代碼固然望起來很長,然則效率很高,若是用數組來存儲,代碼確鑿精簡了,望起來確鑿易今彩539中2個號碼多少錢懂了,然則很鋪張時間,每一次的最小邊都要花O(n)的時間往探求,若是用堆(優先行列步隊),間接扣問隊頂元素就可以了。若是你并不清晰用著布局體的優先行列步隊,就肯定不會懂得如下這段代碼的意思,這段代碼透露表現按cost的值進行排序,由于布局體中有三個元素,不六合彩怎麼算這么寫就沒法按你的情意排序。

14 bool operator < (const tree& a,const tree& b)
15 {
16     return a.cost>b.cost;
17 }

T2:

1349:【例4-10】最優布線成績

時間限定: 1000 ms ??? ??? 內存限定: 65536 KB
提交數: 1228 ??? 經由過程數: 733?

【標題描寫】

黌舍有n臺計算機,為了便利數據傳輸,現要將它們用數據線毗鄰起來。兩臺計算機被毗鄰是指它們稀有據線毗鄰。因為計算機所處的地位不同,是以不同的兩臺計算機的毗鄰用度每每是不同的。

當然,若是將恣意兩臺計算機都用數據線毗鄰,用度將是相稱復雜的。為了節儉用度,咱們采取數據的直接傳輸手腕,即一臺計算機可以直接的經由過程多少臺計算機(作為直達)來完成與另一臺計算機的毗鄰。

目前由你擔任毗鄰這些計算機,使命是使恣意兩臺計算機都連通(不論是間接的或者直接的)。

【輸出】

第一舉動整數n(2≤n≤100),透露表現計算機的數量。此后的n行,每行n個整數。第x+1行y列的整數透露表現間接毗鄰第x臺計算機以及第y臺計算機的用度。

【輸入】

一個整數,透露表現最小的毗鄰用度。

【輸出樣例】

3
0 1 2
1 0 1
2 1 0

【輸入樣例】

2

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。