
#include <bits/stdc++.h>
using namespace std;
const int N=2*500+10;
int g[N][N];
int n,m;
const int INF=0x3f3f3f3f;
const int fill_val=0x3f;
bool vis[N];
int dis[N];
int ans;
void prim()
{
memset(dis,fill_val,sizeof dis);
dis[1]=0;
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&(t==-1||dis[j]<dis[t]))
{
t=j;
}
}
if(dis[t]==INF)
{
printf("impossible");
return;
}
ans+=dis[t];
vis[t]= true;
for(int j=1;j<=n;j++)
{
dis[j]=min(dis[j],g[t][j]);
}
}
printf("%d",ans);
}
int main()
{
scanf("%d%d",&n,&m);
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
g[i][j]=INF;
}
}
}*/
memset(g,fill_val,sizeof g);
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[v][u]=g[u][v]=min(g[u][v],w);
}
prim();
return 0;
}
本题坑点:最小生成树问题是无向图的问题,在读入的时候要注意无向对于重边和自环的处理:只需要取最小的那个就好了本题坑点:最小生成树问题是无向图的问题,在读入的时候要注意无向
对于重边和自环的处理:只需要取最小的那个就好了本题坑点:最小生成树问题是无向图的问题,在读入的时候要注意无向对于重边和自环的处理:只需要取最小的那个就好了

可以看出primprimprim算法就是dijsktradijsktradijsktra算法改了一改
该博客探讨了如何运用Prim算法来找到无向图的最小生成树。在读入图的数据时,注意处理重边和自环,取边权值的最小值。程序实现中初始化所有节点距离为无穷大,通过不断更新距离并标记已访问节点,直至构建完整个树。最终输出最小生成树的总权重。
2万+

被折叠的 条评论
为什么被折叠?



