[C++] 畅通工程之最低成本建设问题 →→→→→进入此内容的聊天室

来自 , 2021-04-04, 写在 C++, 查看 144 次.
URL http://www.code666.cn/view/7b7a53e2
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int M[1002][1002], Dist[1002], TF[1002];
  4. void tree(int N)
  5. {
  6.     int k, sum=0 ,i ,j;
  7.     for ( i = 2; i <= N; i ++)//把所有与顶点1相邻的边放入Dist数组
  8.         Dist[i] = M[1][i];
  9.     TF[1] = 1;
  10.     for ( i = 0; i < N-1; i ++)
  11.     {
  12.         int min1 = 9999, k = -1;
  13.         for ( j = 1; j <= N ; j ++)
  14.         {
  15.             if ( !TF[j] && Dist[j] < min1)//如果当前道路未被经过且权值小于当前最小的权值
  16.             {
  17.                 min1 = Dist[j];//更改最小权值数值
  18.                 k = j;//记录最小全职的下标
  19.             }
  20.         }
  21.         if ( k == -1 )//如果K的下标还是-1,说明没有通向该村庄的道路
  22.         {
  23.             cout<<"Impossible"<<endl;
  24.             return ;
  25.         }
  26.         TF[k] = 1;//记录该条道路已经过
  27.         sum += min1;
  28.         for ( j = 1; j <= N; j ++)
  29.         {
  30.             if ( !TF[j] && M[k][j] < Dist[j] )
  31.                 Dist[j]=M[k][j];
  32.         }
  33.     }
  34.     cout<<sum<<endl;
  35. }
  36. int main()
  37. {
  38.     int N, m, i, j;
  39.     while(cin>>N>>m)
  40.     {
  41.         for ( i = 1 ;i <= N ; i ++)
  42.         {
  43.             Dist[i] = 9999;
  44.             TF[i] = 0;//所有道路都标志为未经过
  45.             for ( j = 1; j <= N ; j ++)
  46.                 M[i][j] = 9999;//所有道路权值初始化为无穷大
  47.         }
  48.         for ( i = 0 ; i < m ; i ++)//输入有权无向图的邻接矩阵
  49.         {
  50.             int a, b, c;
  51.             cin>>a>>b>>c;
  52.             M[a][b] = c;
  53.             M[b][a] = c;
  54.         }
  55.         tree(N);
  56.     }
  57.     return 0;
  58. }
  59.  

回复 " 畅通工程之最低成本建设问题"

这儿你可以回复上面这条便签

captcha