这道题我真是觉得很是无语。
这道题并不难,只要知道prim算法或者Kruscal算法就可以了。
不过要解出这道题要注意以下几点:
1、连接两个城市的道路可能有多条,我们必须取最短的一条。
2、适时终止prim算法或者Kruscal算法 ---为什么这么讲,请看下面的AC代码
#include<stdio.h> #include<string.h> #define Max 0x3f3f3f3f int maze[502][502],n; void prim() { int dis[502],visit[502],i,j,sum=0,k; memset(visit,0,sizeof(visit)); for(i=2;i<=n;i++) dis[i]=maze[1][i]; visit[1]=1; for(i=2;i<=n;i++) { int Min=Max; for(j=2;j<=n;j++) if(visit[j]!=1&&dis[j]<Min) { Min=dis[j]; k=j; } sum+=Min; if(Min==Max) //这里就是我说的适时终止 ,如果没有这条语句我试过一直WA 一方面是节省时间 break; //我看了下数据的范围,知道不管终不终止,都不会超范围的---可就是非加不可 visit[k]=1; for(j=2;j<=n;j++) if(dis[j]>maze[k][j]&&visit[j]!=1) dis[j]=maze[k][j]; } if(sum>=Max) //条件输出 printf("-1\n"); //尝试了多种条件输出的方式,但都必须加上上面的适时输出才能AC 对此我还是有些疑惑 else printf("%d\n",sum); //如果有大牛看出了猫腻,请回复或者评论一下 大家一起学习才是王道^_^ } int main() { int c,x,y,d,a[502],b,sum=0,t,i,j,k,m,p; while(scanf("%d",&c)!=EOF) { while(c--) { scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++) for(j=1;j<=n;j++) maze[i][j]=Max; for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&d); if(d<maze[x][y]) maze[x][y]=maze[y][x]=d; } for(i=1;i<=k;i++) { scanf("%d",&t); for(j=1;j<=t;j++) scanf("%d",&a[j]); for(p=1;p<=t;p++) for(j=1;j<=t;j++) maze[a[p]][a[j]]=maze[a[j]][a[p]]=0; //仍连接城市距离赋为0 } prim(); } } return 0; }