最小生成树——prim算法

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;
}

你可能感兴趣的:(最小生成树)