pku 2485 Highways 典型最小生成树

本文介绍了一个典型的最小生成树问题解决方案,通过PRIM算法实现。该算法采用邻接矩阵存储图,并通过不断选择最短边的方式构造最小生成树,最终找到树中最长的边。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接

http://acm.pku.edu.cn/JudgeOnline/problem?id=2485

典型最小生成树

 

 

#include <stdio.h>

#define MAX_V 501
int arc[MAX_V][MAX_V];

int N;
struct CloseEdge{
 int adjvex;
 int lowcost;
}closedge[MAX_V];

int longest;

void MiniSpanTree_PRIM(int u){
 longest = 0;
 //初始化辅助数组
 int i,j,k;
 for(i = 0;i < N;i++)
  if(i != u){
   closedge[i].adjvex = u;
   closedge[i].lowcost = arc[u][i];
  }
 //初始,U = {u}
 closedge[u].lowcost = 0;
 //选择其余N - 1个顶点
 for(i = 0;i < N - 1;i++){
  //求出最小生成树的下一个节点,第k顶点
  int MaxCost = 1 << 20;
  for(j = 0; j < N;j++)
   if(closedge[j].lowcost != 0 && MaxCost > closedge[j].lowcost)
   {
    MaxCost = closedge[j].lowcost;
    k = j;
   }
  if(longest < closedge[k].lowcost)
   longest = closedge[k].lowcost;
  //k顶点加入到U集
  closedge[k].lowcost = 0;
  //新节点添加到树后,修改closedge数组
  for(j = 0;j < N;j++)
   if(closedge[j].lowcost > arc[k][j]){
    closedge[j].adjvex = k;
    closedge[j].lowcost = arc[k][j];
   }
 }
}

int main(){
 //FILE *fp = fopen("data.txt","r");
 int test;
 //fscanf(fp,"%d",&test);
 scanf("%d",&test);
 while(test--){
  //fscanf(fp,"%d",&N);
  scanf("%d",&N);
  for(int i = 0;i < N;i++)
   for(int j = 0;j < N;j++)
    //fscanf(fp,"%d",&arc[i][j]);
    scanf("%d",&arc[i][j]);
  MiniSpanTree_PRIM(0);
  printf("%d/n",longest);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值