演算法步驟:
1)把所有邊存在乙個陣列裡邊,按權值從小到大排個序
2)從小到大取出每一條邊,看看邊的兩個端點在不在乙個聯通集上(並查集),如果在就捨棄這條邊看下一條,不在就把這兩個點並起來,答案加上這條邊的長度。
3)判斷一下最終是否是聯通的,如果是連通的就是一棵最小生成樹了。
**:
#include#include #include #include #include #include #include #include using namespace std;
const int maxn = 10005;
int pre[maxn];
int find(int x)
int i=x,j;
while(pre[i]!=r)
return r;
}struct edgeedges[maxn];
bool cmp(edge a, edge b)
int main()
int ans = 0;
sort(edges+1,edges+n+1,cmp);
for(int i=1; i<=n; i++)
}int cnt = 0;
for(int i=1; i<=m; i++)
if(cnt > 1) printf("?\n");
else printf("%d\n",ans);
}return 0;
}
Algorithm 最小生成樹之 Kruskal
個人觀點,較prime演算法,kurskal演算法更加的簡單,這裡我們只需要每一次去需找權值最小的那條邊就好,在這裡我們先可以利用sort進行快排,得到權值最小的map i 得到該條邊的兩個節點map i u 和map i v,這時候你需要判斷能不能用這條邊,因為最小生成樹是不能形成迴路,所以用到了...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...