#include<stdio.h>
#include<string.h>
using namespace std;
int map[505][505];
int v, e;
int prime()
{
bool vis[505];
int dist[505];
int i,j,sum=0;
for(i=1;i<=v;i++)
{
vis[i]=0;
//先假设编号为1的点加入MST
dist[i]=map[1][i];
}
vis[1]=1;
for(i=1;i<v;i++)
{
int k,min=0x3f3f3f3f;
for(j=1;j<=v;j++)
{
if(!vis[j]&&dist[j]<min)
{
min=dist[j];
k=j;
}
}
/*
在这也统计下加入了几天边,判断是否构成MST
*/
sum+=dist[k];
vis[k]=1;
//下面更新已加入最小生成树的点离其它点的最短距离
for(j=1;j<=v;j++)
{
if(!vis[j]&&dist[j]>map[k][j])
dist[j]=map[k][j];
}
}
return sum;
}
int main()
{
int n;
int i;
int waibu;
scanf("%d", &n);
while(n--)
{
memset(map, 0, sizeof(map));
scanf("%d %d", &v, &e);
int a, b, c;
for(i = 0; i< e; i++)
{
scanf("%d %d %d", &a, &b, &c);
map[a][b] = c;
map[b][a] = c;
}
int min = 0x3f3f3f3f;
for(i = 0; i< v; i++)
{
scanf("%d", &waibu);
if(min > waibu)
min = waibu;
}
printf("%d\n", prime() + min);
}
return 0;
}
最小生成树prime算法模板
最新推荐文章于 2024-09-26 13:38:39 发布
本文介绍了一个使用C语言实现的最小生成树(MST)算法,该算法通过Prim算法找到一个带权无向图的最小生成树,并考虑了外部节点的最小权重来优化整体结构。程序首先读取顶点数和边数,然后输入各边的权重,最后计算并输出最小生成树的总权重。
摘要由CSDN通过智能技术生成