无向连通图最小生成树

1006: 无向连通图最小生成树

题目描述:
请输出无向连通图最小生成树权重之和。
输入:
第一行是2个整数,分别表示顶点个数n和边数m。接下来的m行中,每一行第一个整数表示边的开始顶点,第二个表示边的结束顶点,第三个表示这条边的权重。
(测试数据中保证图是连通图;
没有自环;
两个顶点之间只有一条边;
0<权重<100(可以相等);n<=50; m<=1000;)
输出:
输出无向连通图最小生成树权重之和。
样例输入输出:
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6

输出:15
代码输入:

#include
#include
#include
using namespace std;
void findMin(vector &A,vector &B, int **G, int **newG)
{
 int minu, minv;
 int min = INT_MAX;
 for (int i = 0; i < A.size(); i++)
 {
  for (int j = 0; j < B.size(); j++)
  {
   if ((G[A[i] - 1][B[j] - 1] < min)&&(G[A[i]-1][B[j]-1]!=0))
   {
    minu = A[i];
    minv = B[j];
    min = G[A[i]-1][B[j]-1];
   }
  }
 }
 A.push_back(minv);
 for (vector::iterator it = B.begin(); it <= B.end();it++)
 {
  if (*it == minv)
  {
   B.erase(it);
   break;
  }
 }
 newG[minu-1][minv-1] = G[minu-1][minv-1];
 newG[minv - 1][minu - 1] = G[minv - 1][minu - 1];
}
int main()
{
 int n, m;
 cin >> n >> m;
 int **G = new int*[n];
 int **newG = new int*[n];
 for (int i = 0; i < n; i++)
 {
  G[i] = new int[n];
  newG[i] = new int[n];
  for (int j = 0; j < n; j++)
  {
   G[i][j] = 0;
   newG[i][j] = 0;
  }
 }
 for (int i = 0; i < m; i++)
 {
  int p, q, r;
  cin >> p >> q >> r;
  G[p-1][q-1] = r;
  G[q - 1][p - 1] = r;
 }
 vector A;
 vector B;
 A.push_back(1);
 for (int i = 2; i <= n; i++)B.push_back(i);
 while (A.size() != n)
 {
  findMin(A, B, G, newG);
 }
 int sum = 0;
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
  {
   sum += newG[i][j];
  }
 }
 cout << sum/2;
}

你可能感兴趣的:(专业)