最小生成樹的乙個作用,就是求最小花費。要在n個城市之間鋪設光纜,主要目標是要使這 n 個城市的任意兩個之間都可以通訊,但鋪設光纜的費用很高,且各個城市之間鋪設光纜的費用不同,因此另乙個目標是要使鋪設光纜的總費用最低。這就需要找到帶權的最小生成樹。
主要思路:貪心,假設一共有五個點,按道理來講,應該是先找到圖中最小權值的兩個點沒然後對剩餘的點進行遍歷。但是也可以任意指定乙個點。可以任意指定的原因就是,如果給定的資訊可以構成最小生成樹的話,那麼最小生成樹中一定有所有的點,那麼這個點也一定在樹上,所以可以任意指定乙個點進行迴圈。指定第乙個點後,然後尋找其他還沒有訪問的點到該點的最小距離,找到之後,將該點放入已經訪問過的集合中,然後再找剩下的未訪問的點到已經訪問的這一坨中的點的最小距離,然後不停的迴圈這個過程,知道所有的點都訪問為止。(如果是最大生成樹的話,直接改克魯斯卡爾中的sort就可以了,最小生成樹是公升序,最大生成樹就是降序)
例題:**:(prim)
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
# define maxn 1005
# define inf 0x3f3f3f3f
int a[maxn][maxn];
int dis[maxn];
int n,m;
int vis[maxn];
int flag;
int prime()
}}return sum;
}int main()
//自己到自己的距離是0
flag=0;
for(int i=1; i<=m; i++)
}int t=prime();
if(m克魯斯卡爾演算法:
#include#include#include#include#include#include#includeusing namespace std;
# define maxn 10000+10
int n,m;
struct node
edge[maxn];
int father[maxn];
int find(int t)
bool cmp(node t1,node t2)
int t=kruskal();
cout<}
return 0;
}
克魯斯卡爾演算法
測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...
克魯斯卡爾演算法
設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...
克魯斯卡爾演算法
via 克魯斯卡爾演算法 在連通網中求出最小生成樹 include include define maxedge 20 define maxvex 20 define infinity 65535 typedef struct mgraph typedef struct edge 對邊集陣列edge...