60行代码,没用花里胡哨的优化。 如下:
#include<iostream>//PRIM
using namespace std;
int n,m,map[5010][5010],g[5010],s;//g存储使用情况(0已用,1未用),map存边权
int dis[5010];//每个点到已完成部分的最小值
void MST()
{
g[1]=0;//以1起始点
for(int i=2;i<=n;i++)
{
dis[i]=map[i][1];
}
dis[0]=0x3f3f3f3f;//下标0不用,拿来做特判
for(int i=1;i<n;i++)//n-1条边
{
int v=0;//特判值
for(int j=2;j<=n;j++)
{
if(dis[v]>dis[j]&&g[j])//找最小
{
v=j;
}
}
if(!v)
{
cout<<"orz";
exit(0);//全局退出
}
//操作一下
g[v]=0;
s+=dis[v];
for(int j=2;j<=n;j++)//更新
{
if(g[j]&&dis[j]>map[v][j])
{
dis[j]=map[v][j];
}
}
}
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)//初始化
{
for(int j=1;j<=n;j++)
{
map[i][j]=0x3f3f3f3f;
}
map[i][i]=0;
g[i]=1;
}
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
MST();
cout<<s;
return 0;
}
蒟蒻看了半下午实在有点崩,于是乎请教巨佬~orz