道路建设问题是牵扯最小生树的算法,但是根据具体的情况有时并不需要真的去生成树,这道题就是这样,我们只需要标记哪些地点已经连接。这次的代码使用的是点贪心(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每次的变化,可以很好的了解问题!