最小生成樹 prim演算法 C++實現
阿新 • • 發佈:2019-01-28
#include <iostream>
#include <vector>
#define Inf 0x7fffffff
using namespace std;
int main()
{
int n,m;//節點個數和邊數
cin>>n>>m;//輸入節點個數和邊數;
vector<vector<int>> v(n+1,vector<int>(n+1,Inf));//鄰接矩陣
for(int i=0;i<m;++i)
{
int s,e,w;
cin >>s>>e>>w;
v[s][e]=v[e][s]=w;
}
int s=1,sumcost=0;//開始收錄的節點,累計最小花費
vector<int> cost=v[s];
vector<bool> vis(n+1,false);//是否已經收錄
vis[s]=true;
for(int k=1;k<n;++k)
{
int mincost=Inf,u=-1;
for(int i=1;i<=n;++i) if(!vis[i]&&cost[i]<mincost) mincost=cost[u=i];//找到最小花費
sumcost+=mincost;
vis[u]=true;
for(int i=1;i<=n;++i) if(!vis[i]&&cost[i]>v[i][u]) cost[i]=v[i][u];//通過新收錄的節點u,重新更新最小花費
}
cout<<sumcost;
return 0;
}