鱼C论坛

 找回密码
 立即注册
查看: 2589|回复: 2

关于最小生成树的一道经典题目,大家救救孩子吧

[复制链接]
发表于 2019-6-26 18:46:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 447908543 于 2019-6-27 14:40 编辑

百炼1251:丛林中的路,http://bailian.openjudge.cn/practice/1251/,我用prim算法写的c程序,一直提示Runtime Error,我是真的不知道错在哪了,大家救救孩子吧
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>

  5. typedef struct
  6. {
  7.         int vexnum;
  8.         int **arc;       
  9. }G;

  10. typedef struct
  11. {
  12.         int name;//终站
  13.         int min;       
  14. }Prim;

  15. int color[30];

  16. G *Init(int n)
  17. {
  18.         G *p=(G *)malloc(sizeof(G));
  19.         p->vexnum=n;
  20.         p->arc=(int **)malloc(sizeof(int*)*p->vexnum);
  21.         for(int i=0;i<p->vexnum;i++)
  22.         {
  23.                 p->arc[i]=(int *)malloc(sizeof(int)*p->vexnum);
  24.         }
  25.         for(int i=0;i<p->vexnum;i++)
  26.         {
  27.                 for(int j=0;j<p->vexnum;j++)
  28.                 {
  29.                         p->arc[i][j]=0;
  30.                 }
  31.         }
  32.        
  33.         char cstart,cend;
  34.         int way,power;
  35.         for(int i=0;i<p->vexnum-1;i++)
  36.         {
  37.                 scanf("%c",&cstart);
  38.                 getchar();
  39.                 scanf("%d",&way);
  40.                 getchar();
  41.                 while(way--)
  42.                 {
  43.                         scanf("%c",&cend);
  44.                         getchar();
  45.                         scanf("%d",&power);
  46.                         getchar();
  47.                         p->arc[cstart-'A'][cend-'A']=power;
  48.                         p->arc[cend-'A'][cstart-'A']=power;
  49.                 }
  50.         }
  51.         return p;
  52. }

  53. void Create_t(G *graph,Prim *t)
  54. {
  55.         int min;
  56.         for(int i=0;i<graph->vexnum;i++)
  57.         {
  58.                 min=100;
  59.                 for(int j=0;j<graph->vexnum;j++)
  60.                 {
  61.                         if(graph->arc[i][j]&&graph->arc[i][j]<min&&!color[j])
  62.                         {
  63.                                 min=graph->arc[i][j];
  64.                                 t[i].name=j;
  65.                         }
  66.                 }
  67.                 t[i].min=min;
  68.         }
  69.        
  70. }

  71. void PrimInit(G *graph)
  72. {
  73.         int num=graph->vexnum;
  74.         Prim *t=(Prim *)malloc(sizeof(Prim)*graph->vexnum);
  75.         int index,cost=0;
  76.         color[0]=1;
  77.         while(--num)
  78.         {
  79.                 Create_t(graph,t);
  80.                 int min=100;
  81.                 for(int i=0;i<graph->vexnum;i++)
  82.                 {
  83.                         if(color[i]==1&&min>t[i].min&&!color[t[i].name])
  84.                         {
  85.                                 min=t[i].min;
  86.                                 index=i;
  87.                         }
  88.                 }
  89.                 color[t[index].name]=1;
  90.                 cost+=min;
  91.                 graph->arc[index][t[index].name]=100;
  92.                 graph->arc[t[index].name][index]=100;
  93.         }
  94.         printf("%d\n",cost);
  95. }

  96. void Init_color()
  97. {
  98.         for(int i=0;i<30;i++)
  99.         {
  100.                 color[i]=0;
  101.         }
  102. }

  103. void end(G *graph)
  104. {
  105.         for(int i=0;i<graph->vexnum;i++)
  106.         {
  107.                 free(graph->arc[i]);
  108.         }
  109.         free(graph);
  110. }

  111. int main(void)
  112. {
  113.         int n;
  114.         scanf("%d",&n);
  115.         while(n)
  116.         {
  117.                 fflush(stdin);
  118.                 Init_color();
  119.                 G *graph=Init(n);
  120.                 PrimInit(graph);
  121.                 scanf("%d",&n);
  122.                 end(graph);
  123.         }
  124.         return 0;
  125. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-26 20:16:05 | 显示全部楼层
首先没看逻辑错误,语法错误主要在指针和结构体这边

Prim *t;  
(*t).name和t->name应该这样用。
还有里面那个color=0应该是color[i] = 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-27 14:40:01 | 显示全部楼层
newu 发表于 2019-6-26 20:16
首先没看逻辑错误,语法错误主要在指针和结构体这边

Prim *t;  

感谢回答,不知道为什么我直接复制粘贴在帖子里面有些 [] 没有显示出来,我重新编辑了一下,个人感觉语法应该没有问题,可能是在测试某一组数据的时候崩了,因为使用测试数据的时候我这个程序都完全正常,还是谢谢您的回复!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表