数据结构实验之图论六:村村通公路

系统管理员 2022-06-15 06:15 261阅读 0赞

Problem Description

当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。

Input

连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。

Output

输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。

Example Input

  1. 5 8
  2. 1 2 12
  3. 1 3 9
  4. 1 4 11
  5. 1 5 3
  6. 2 3 6
  7. 2 4 9
  8. 3 4 4
  9. 4 5 6

Example Output

  1. 19
  2. 方法一:
  3. #include<stdio.h>
  4. #include<string.h>
  5. #define maxn 1005
  6. #define max 0x3f3f3f3f
  7. typedef struct node
  8. {
  9. int begin;
  10. int end;
  11. int weight;
  12. }edge;
  13. int map[maxn][maxn];
  14. edge line[maxn];
  15. void getmap(int m)
  16. {
  17. int i;
  18. int u,v,w;
  19. for(i=1;i<=m;i++)
  20. {
  21. scanf("%d%d%d",&u,&v,&w);
  22. map[u][v]=map[v][u]=w;
  23. }
  24. }
  25. int prim(int n)
  26. {
  27. int i,j,k,u;
  28. int min;
  29. int v;
  30. int num;
  31. int sum=0;
  32. edge temp;
  33. for(i=1;i<=n-1;i++)
  34. {
  35. line[i].begin=1;
  36. line[i].end=i+1;
  37. line[i].weight=map[1][i+1];
  38. }
  39. for(j=1;j<=n-1;j++)
  40. {
  41. min=max;
  42. for(k=j;k<=n-1;k++)
  43. {
  44. if(line[k].weight<min)
  45. {
  46. min=line[k].weight;
  47. u=k;
  48. }
  49. }
  50. sum+=min;
  51. v=line[u].end;
  52. temp=line[u];
  53. line[u]=line[j];
  54. line[j]=temp;
  55. for(k=j+1;k<=n-1;k++)
  56. {
  57. num=map[v][line[k].end];
  58. if(line[k].weight>num)
  59. {
  60. line[k].weight=num;
  61. line[k].begin=v;
  62. }
  63. }
  64. }
  65. return sum;
  66. }
  67. int main()
  68. {
  69. int n,m;
  70. int sum;
  71. while(scanf("%d%d",&n,&m)!=EOF)
  72. {
  73. memset(map,max,sizeof(map));
  74. getmap(m);
  75. sum=prim(n);
  76. if(sum>max)
  77. {
  78. printf("-1\n");
  79. }
  80. else
  81. {
  82. printf("%d\n",sum);
  83. }
  84. }
  85. return 0;
  86. }
  87. 方法二:
  88. #include<stdio.h>
  89. #include<string.h>
  90. #define max 0x3f3f3f3f
  91. #define maxn 1005
  92. typedef struct
  93. {
  94. int begin;
  95. int end;
  96. int length;
  97. }edge;
  98. int map[maxn][maxn];
  99. int dis[maxn];
  100. int book[maxn];
  101. void getmap(int m)
  102. {
  103. int i;
  104. int u,v,w;
  105. for(i=0;i<m;i++)
  106. {
  107. scanf("%d%d%d",&u,&v,&w);
  108. map[u][v]=map[v][u]=w;
  109. }
  110. }
  111. int prim(int n)
  112. {
  113. int i,j,k;
  114. int min;
  115. int sum=0;
  116. for(i=1;i<=n;i++)
  117. {
  118. dis[i]=map[1][i];
  119. }
  120. book[1]=1;
  121. for(i=1;i<n;i++)
  122. {
  123. min=max;
  124. for(j=1;j<=n;j++)
  125. {
  126. if(dis[j]<min&&book[j]==0)
  127. {
  128. min=dis[j];
  129. k=j;
  130. }
  131. }
  132. book[k]=1;
  133. sum+=min;
  134. for(j=1;j<=n;j++)
  135. {
  136. if(dis[j]>map[k][j]&&book[j]==0)
  137. {
  138. dis[j]=map[k][j];
  139. }
  140. }
  141. }
  142. return sum;
  143. }
  144. int main()
  145. {
  146. int n,m;
  147. int ans;
  148. while(scanf("%d%d",&n,&m)!=EOF)
  149. {
  150. memset(book,0,sizeof(book));
  151. memset(map,max,sizeof(map));
  152. getmap(m);
  153. ans=prim(n);
  154. if(ans>max)
  155. {
  156. printf("-1\n");
  157. }
  158. else
  159. {
  160. printf("%d\n",ans);
  161. }
  162. }
  163. return 0;
  164. }

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读