注意n个点有n-1条边就ok
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
char a[502][10];
int b[502][5] = {0};
int map[502][502];
int dis[502];
bool flag[502];
int result;
int mi(int i, int j){
int sum = 0;
int temp;
for(int k = 1; k <= 4; k++){
temp = abs( b[i][k] - b[j][k]);
if(temp > 5)
temp = 10 - temp;
sum += temp;
}
return sum;
}
void prim ()
{
int i,j;
int mark;
result=0;
memset(flag,false,sizeof(flag));
flag[1]=true;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
for(i=1;i<n;i++)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
int min=999999999;
for(j=2;j<=n;j++)
{
if(!flag[j]&&dis[j]<=min)
{
min=dis[j];
mark=j;
}
}
flag[mark]=true;result+=dis[mark];
for(j=2;j<=n;j++)
{
if(!flag[j]&&map[mark][j]<dis[j])
dis[j]=map[mark][j];
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(map ,0, sizeof(map));
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s",a[i]);
for(int j = 0;j < 4;j++){
b[i][j+1] = a[i][j] -'0';
}
}
for(int i = 0;i < n;i++){
for(int j = i + 1;j <= n;j++){
map[j][i] = map[i][j] = mi(i ,j);
}
}
prim();
int min1 =9999999;
for(int i = 1;i <= n;i++)if(map[0][i] < min1)min1 = map[0][i];
result += min1;
printf("%d\n",result);
}
}
本文介绍了一个基于最小生成树算法的应用实例,通过计算不同节点之间的距离来构建最小生成树,并结合Prim算法解决实际问题。文章详细展示了如何用C++实现这一过程,包括节点间距离的计算、Prim算法的具体步骤等。
1155

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



