標籤:
prim演算法是選取任意一個頂點作為樹的一個節點,然後貪心的選取離這棵樹最近的點,直到連上所有的點並且不夠成環,它的時間複雜度為o(v^2)
#include<iostream>
#include<algorithm>
#define INF 10000000
using namespace std;
int v,e;
int cost[1000][1000];
int mincost[1000];
bool used[1000];//判斷一個點是否已經在最小產生樹中了
int ans=0;
void prim()
{
int i;
for(i=1;i<=v;i++)
{
mincost[i]=INF;
used[i]=false;
}
mincost[1]=0;
while(1)
{
int x=-1;//x的初始化一定是在while迴圈內
for(i=1;i<=v;i++)//從不屬於最小產生樹的頂點中選取樹到該點邊權最小的頂點
{
if(!used[i]&&(x==-1||mincost[i]<mincost[x])) x=i;
}
if(x==-1) break;//如果再沒有頂點可以選取則跳出
ans+=mincost[x];
used[x]=true;
for(i=1;i<=v;i++)
{
mincost[i]=min(mincost[i],cost[x][i]);//不斷更新樹到各個點之間的距離
}
}
}
int main()
{
cin >> v >> e;
for(int j=1;j<=v;j++)
for(int k=1;k<=v;k++)
{
if(j==k) cost[j][k]=0;
else cost[j][k]=INF;
}
for(int i=0;i<e;i++)
{
int s1,t1,c1;
cin >> s1 >> t1 >> c1;
cost[s1][t1]=c1;
cost[t1][s1]=c1;//道路可單向可雙向
}
prim();
cout << ans << endl;
return 0;
}
最小產生樹——prim演算法