hdu 1232 最小生成树

  1. #include <stdio.h>
  2. #include <string>
  3. #define SIZE 1100
  4. #define INF 0x7fffffff
  5. int map[1100][1100], weight[1100], pre[1100], length, point;
  6. bool sign[1100];
  7. void prim(int weight[],int map[][SIZE], int pre[], bool sign[], int &length, int point_num, int source, int &point)
  8. {
  9. point =1; //source源起点,一定要是路径中有的
  10. for(int i=1; i<=point_num; i++) //这里的路径的标号都 > 1,记录所以点到源起点的权值,前驱,将该点置为已经查找
  11. {
  12. weight[i] = map[source][i];
  13. pre[i] = source; sign[i] = true;
  14. }
  15. sign[source] = false; length = 0;
  16. for(int i=1; i<point_num; i++) //枚举n-1个点,即n-1个通路
  17. {
  18. int min = INF, sign_node = i; //sign_node 记录找到的最小的下一个点
  19. for(int j=1; j<=point_num; j++) //查找最小权值的路径
  20. {
  21. if(sign[j] && weight[j] < min)
  22. {min = weight[j]; sign_node = j; }
  23. }
  24. {sign[sign_node] = false; length += min; }
  25. if(min != INF )
  26. point++; //可以在这里添加一个标记,使他值等于min,如果最后值等于最大值,则不能生成最小生成树
  27. for(int j=1; j<=point_num; j++) //重新设定源起点,将剩下的未找的点加入
  28. {
  29. if(weight[j] > map[sign_node][j] && sign[j] )
  30. {weight[j] = map[sign_node][j]; pre[j] = sign_node;}
  31. }
  32. }
  33. }
  34. int a;
  35. void input(int n, int map[][SIZE])
  36. {
  37. for(int i=1; i<=n ;i++)
  38. {
  39. int b;
  40. scanf("%d%d", &a, &b);
  41. map[a][b] = 0; map[b][a] = 0;
  42. }
  43. }
  44. int main()
  45. {
  46. int N,M;
  47. while(scanf("%d %d", &N, &M) && N )
  48. {
  49. //scanf("%d", &M);
  50. for(int i=0; i<=N; i++) //初始化
  51. {
  52. weight[i] = INF; pre[i] = 0;
  53. for(int j=0; j<=N; j++)
  54. map[i][j] = INF;
  55. }
  56. memset(sign, false, sizeof(sign) );
  57. length = point = 0;
  58. input( M, map);
  59. prim(weight, map, pre, sign, length, N, a, point); //查找,注意这个1 它是源起点,一定要是在路径上已知的点
  60. printf("%d ", N-point);
  61. }
  62. return 0;
  63. }





附件列表

    原文地址:https://www.cnblogs.com/sober-reflection/p/dba7cc43fbc8f7a4d31983fdb74e43d7.html