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<iostream>
#include<limits.h>
#include<vector>
using namespace std;
void findMin(vector<int> &A,vector<int> &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<int>::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<int> A;
vector<int> 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;
}