题目
思路
代码
prim
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001
#define INF 999999
int cost[MAXN][MAXN]; // 存权值
int prim(int cost[][MAXN], int n, int u)
// 选定u在U里
{
int res = 0;
int lowcost[MAXN]; // 从U到V-U的各条边代价
int closest[MAXN]; // 最小的代价在U里哪个顶点上
for (int i = 1; i <= n; i++)
// 初始化
{
lowcost[i] = cost[u][i];
closest[i] = u; // 此时U里只有u
}
// 顶点u在U内
lowcost[u] = 0;
for (int i = 1; i < n; i++)
// 一共找n-1条边
{
int minCost = INF;
int k = 0;
for (int j = 1; j <= n; j++)
{
if (lowcost[j] != 0 && lowcost[j] < minCost)
// j不在U里且代价更小
{
minCost = lowcost[j];
k = j;
}
}
res += minCost;
// 选出了距离U最小的点k,将k放进U里
lowcost[k] = 0;
for (int j = 1; j <= n; j++)
// 更新lowcost
{
if (lowcost[j] > cost[k][j])
{
lowcost[j] = cost[k][j];
closest[j] = k;
}
}
}
int flag = 1;
for (int i = 1; i <= n; i++)
{
if (lowcost[i] != 0)
{
flag = 0;
break;
}
}
if (flag)
return res;
else return -1;
}
int main()
{
int n, m; cin >> n >> m;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
cost[i][j] = INF+1;
}
}
for (int i = 0; i < m; i++)
{
int x, y, w; cin >> x >> y >> w;
if(w<cost[x][y]&&w<cost[y][x])
{
cost[x][y] = w;
cost[y][x] = w;
}
}
int res = prim(cost, n, 1);
cout << res << endl;
return 0;
}
kruskal
#include<bits/stdc++.h>
#define MAXN 1001
using namespace std;
struct Edge
{
int begin;
int end;
int weight;
Edge(int x, int y, int w)
{
begin = x;
end = y;
weight = w;
}
};
int root[MAXN] = { 0 };
vector<Edge> v;
bool cmp(Edge a, Edge b)
{
return a.weight < b.weight;
}
int find(int x)
{
int tmp = x;
while (root[tmp]!=tmp)
{
tmp = root[tmp];
}
int k = x;
while (k!=tmp)
{
int j = root[k];
root[k] = tmp;
k = j;
}
return tmp;
}
void join(int x, int y)
{
int rootx = find(x);
int rooty = find(y);
root[rootx] = rooty;
}
int main()
{
int n, m; cin >> n >> m;
for (int i = 0; i < m; i++)
{
int x, y, w; cin >> x >> y >> w;
Edge tmp = Edge(x, y, w);
v.push_back(tmp);
}
sort(v.begin(), v.end(), cmp);
for (int i = 1; i <= n; i++)
{
root[i] = i;
}
int used = 0;
int res = 0;
for (int i = 0; i < m && used < n - 1; i++)
{
int x = find(v[i].begin);
int y = find(v[i].end);
if (x != y)
{
used++;
res += v[i].weight;
join(x, y);
}
}
if (used == n - 1)
cout << res << endl;
else cout << -1 << endl;
return 0;
}