思想:
mst(minimum spanning tree,最小生成樹)問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是:設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u-v中找到另一點b使得點b到v中任意一點的權值最小,此時將b點也加入集合v;以此類推,現在的集合v=,再從集合u-v中找到另一點c使得點c到v中任意一點的權值最小,此時將c點加入集合v,直至所有頂點全部被加入v,此時就構建出了一顆mst。因為有n個頂點,所以該mst就有n-1條邊,每一次向集合v中加入乙個點,就意味著找到一條mst的邊。
過程:
測試用例:
輸入:
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
輸出:
# define inf 0x3f3f3f3f//這個可以與memset(陣列名,inf,sizeof(陣列名)); 這樣可以對陣列的全部元素賦值為最大值
intmap[maxn][maxn],lowcost[maxn];
bool visit[maxn];
int n,m,sum;//n節點 m邊數 sum儲存的是乙個城市到另乙個城市的最小權值
/* map儲存的是map[a][b] --->a到b的權值
lowcost陣列儲存的是乙個城市到其餘的城市的最小的權值
visit儲存的是該節點是否被訪問過
*/void prim();
int main()
prim();
printf("%d\n",sum);
}return0;}
void prim()
for(int i=1;i<=n;i++)
}if(temp == inf)//該節點與任何節點沒有相連,
break;
visit[k] = true;//把這個城市加入最小生成樹集合
sum+=temp; //記錄權值之和
for(int j=1;j<=n;j++)
} } }
最小生成樹 Prim
include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...
最小生成樹 prim
演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...
最小生成樹 PRIM
這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...