uva 4138【最小生成树prime算法】

本文介绍了一个基于最小生成树算法的应用实例,通过计算不同节点之间的距离来构建最小生成树,并结合Prim算法解决实际问题。文章详细展示了如何用C++实现这一过程,包括节点间距离的计算、Prim算法的具体步骤等。

注意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);
  }
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值