prim算法:和Dijkstra算法的实现有些类似
【1】从起点开始往后找和这个点连接的权值最小的点,连到树上
【2】重复第一步
例题:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int Map[505][505];
int vis[505];
int dist[505];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
{
dist[i]=inf;
for(int j=1;j<=n;j++)
{
Map[i][j]=inf;
}
}
}
int prim(int dot)
{
int sum=0;
//将起点的距离设为0
dist[dot]=0;
//共有n个点
for(int i=1;i<=n;i++)
{
int cur = -1;
//找到权值最小的点,记录其下标
for(int j=1;j<=n;j++)
{
if(vis[j]==0&&(cur==-1||dist[j]<dist[cur]))
{
cur=j;
}
}
if(dist[cur]>=inf)
return inf;
sum+=dist[cur];
vis[cur]=1;
//(例如:B点不是连接A点的最近的边
//所以上面的找完了之后也不会把它连进树里面
//但是它是在图里面必须要连进去
for(int k=1;k<=n;k++)
{
//找到还没有被找到的最小权值
if(vis[k]==0)
dist[k]=min(dist[k],Map[cur][k]);
}
}
return sum;
}
int main()
{
cin>>n>>m;
init();
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
Map[u][v]=min(Map[u][v],w);
Map[v][u]=min(Map[v][u],w);
}
int result=prim(1);
if(result>=inf)
cout<<"orz"<<endl;
else
cout<<result<<endl;
return 0;
}
复习之前学过的内容;