1.題目2.題目大意
某地發洪水,導致某些城市被淹而消失,現在想把剩下的零散的城市通過修路連線起來,已知現在有部分城市是連通的(最後一行輸入就是)。可選擇修的路有m條,城市總共有n個,給出了m條路的起點終點和修路花費,問最少可花多少錢能保證所有的城市連通。
3.解題思路
a.首先是建圖,把每個點到另外乙個點修路所需要的花費給確定,graph[a][b] = graph[b][a] = cost; 然後已經聯通的兩個點花費就為0,無關的點就賦給乙個特定的值。
b.然後用prime求出最少的花費就可以了
4.prime
最小生成樹的prime演算法是以點為核心來進行計算.
原理:從乙個點開始遍歷它到其他所有點的距離,無法直接到達的距離為inf,記錄為mindis陣列
如:一共有四個點abcd 五條邊
a——b 2; a——c 1
; a——d 3
; b——c 4
; c——d 2
;選取a為第乙個點,那麼mindis陣列中的值為0,2
,1,3;並將a標記為已經訪問過的點;
然後從未訪問過的點中找最小的值加入生成樹,即此時mindis陣列的最小值為1
(即a——c的距離最短),為c點,將c加入生成樹(即標記c已經訪問),並將sum加上權值1;
現在生成樹中有兩個點a和c,更新mindis陣列,即看c到各個點的值與原來mindis陣列中的值哪乙個小,此時c——d的權值為2,mindis中到d的權值為3,所以更新mindis,更新後為0,2
,1,2;
重複上述步驟直到訪問所有點
80069746
部落格學習
5.ac**
#include
#include
#include
#include
using
namespace std;
#define maxn 555
#define maxint 1005
int pri[maxn]
[maxn]
, d[maxn]
;int n;
void
prime()
}if(min1 == maxint)
break
; sum+
=min1;
lowcost[minid]=1
;//已經用過了,就標記
for(j =
1; j <=n; j++)}
}if(min1 == maxint)
printf
("-1\n");
else
printf
("%d\n"
,sum);}
intmain()
}for
(int i =
0; i< m; i++)}
for(
int i =
0; i)//已經聯通了的點
}prime()
;}return0;
}
C 最小生成樹
樹是指沒有環路的圖,生成樹就是指乙個圖上面刪除一些邊,使它沒有環路。最小生成樹就是指生成樹中邊權之和最小的那一種。上圖的最小生成樹就是這樣 就以上圖為例 先選擇乙個起始點,我們就以a為例。建立乙個集合s,用來儲存已經在樹中間的點。開始時集合那只有點a,即 s 選擇乙個連通到集合s中乙個點的最小邊,其...
hdu 1863 最小生成樹
使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...
hdu 4081 最小生成樹
先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...