道路建设(最小生成树)

道路建设问题是牵扯最小生树的算法,但是根据具体的情况有时并不需要真的去生成树,这道题就是这样,我们只需要标记哪些地点已经连接。这次的代码使用的是点贪心(prim算法),相对而言更简单实现,边贪心(kruskl算法)还要牵扯并查集相对繁琐。

问题来源:https://ac.nowcoder.com/acm/problem/15108

变量解析:

int num[105];标记城市是否已连接,连接为1,初始化为-1(其他也可以)
int juzhen[105][105];邻接矩阵表示图
int money,n,m,sum;记录资金,道路总数,城市总数
int a,b,c;中间变量

具体代码:

#include<stdio.h>
#include<string.h>
int num[105];
int juzhen[105][105];
int money,n,m,sum;
int a,b,c;
void jia(){
 int d=1;
 a=0,b=0,c=999;
 for(int i=1;i<m;i++){
  if(num[i]==1){
   for(int j=2;j<=m;j++){
    if(juzhen[i][j]<c&&num[j]!=1){//这里不需要判断i是否等于j,因为num[i]为1,相等时条件不成立。
     a=i,b=j;
     c=juzhen[i][j];
     }
   }
  }
 }
 sum+=juzhen[a][b];
 num[b]=1;
 juzhen[a][b]=999;
 juzhen[b][a]=999;
}
int main(){
 while(scanf("%d%d%d",&money,&n,&m)==3){
  sum=0;
 for(int i=1;i<=m;i++){
   for(int j=1;j<=m;j++){
   juzhen[i][j]=999;//只要比题干上的100大就可以,子函数里的判断提供方便
   }
   num[i]=-1;//不使用memset函数,是因为memset函数只能初始化为0或-1
  }
  num[1]=1;
  for(int i=0;i<n;i++){
  scanf("%d%d%d",&a,&b,&c);
  if(juzhen[a][b]>c){
   juzhen[a][b]=c;
   juzhen[b][a]=c;
   }
  }
  for(int i=1;i<m;i++)jia();
  if(sum<=money)printf("Yes\n");
  else printf("No\n");
 }
 return 0;
}

如果代码过不了,可以插入一些代码来测试,输出矩阵的内容,sum每次的变化,可以很好的了解问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值