最小生成树
prim
1.朴素
#include <iostream>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int n;
int dis[MAXN];
int w[MAXN][MAXN];
bool vis[MAXN];
int prim ();
int main () {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> w[i][j];
int ans = prim ();
cout << ans;
return 0;
}
int prim () {
int res = 0;
for (int i = 1; i <= n; i++) dis[i] = INF; dis[1] = 0;
for (int i = 1; i <= n; i++) {
int _min = INF, index;
for (int j = 1; j <= n; j++) {
if (vis[j] == 1) continue;
if (dis[j] < _min) {
_min = dis[j];
index = j;
}
}
res += _min;
vis[index] = 1;
for (int j = 1; j <= n; j++) {
if (vis[j] == 1) continue;
if (w[index][j] < dis[j]) {
dis[j] = w[index][j];
}
}
}
return res;
}
2.优化
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
const int MAXN = 505;
const int INF = 0x3f3f3f3f;
int n, m;
int dis[MAXN];
bool vis[MAXN];
struct node {
int v, val;
node () {}
node (int V, int VAL) {
v = V, val = VAL;
}
};
struct edge {
int now, val;
edge () {}
edge (int N, int V) {
now = N, val = V;
}
};
bool operator < (const edge &x, const edge &y) {
return x.val > y.val;
}
vector<node> g[MAXN];
int prim ();
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, val;
cin >> u >> v >> val;
g[u].push_back( node (v, val));
g[v].push_back( node (u, val));
}
int ans = prim ();
cout << ans;
return 0;
}
int prim () {
for (int i = 1; i <= n; i++) dis[i] = INF; dis[1] = 0;
int res = 0;
priority_queue<edge> p; p.push( edge (1, 0));
while (! p.empty()) {
edge tem = p.top(); p.pop();
int u = tem.now, size = g[u].size();
if (vis[u] == 1) continue; vis[u] = 1, res += dis[u];
for (int i = 0; i < size; i++) {
int v = g[u][i].v, w = g[u][i].val;
if (w < dis[v]) {
dis[v] = w;
p.push( edge (v, dis[v]));
}
}
}
return res;
}
kruskal
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 105;
const int MAXM = 205;
int n, m;
int fa[MAXN];
struct node {
int u, v, val;
node () {}
node (int U, int V, int VAL) {
u = U, v = V, val = VAL;
}
}g[MAXM];
int UnionSet (int, int);
int FindSet (int);
int kruskal ();
void MakeSet ();
bool cmp (node x, node y) {
return x.val < y.val;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, val;
cin >> u >> v >> val;
g[i] = node (u, v, val);
}
sort (g + 1, g + 1 + m, cmp);
int ans = kruskal ();
cout << ans;
return 0;
}
int UnionSet (int x, int y, int val) {
int u = FindSet (x), v = FindSet (y);
if (u == v) return 0;
fa[u] = v;
return val;
}
int FindSet (int x) {
if (fa[x] != x) {
fa[x] = FindSet(fa[x]);
}
return fa[x];
}
int kruskal () {
int res = 0;
MakeSet ();
for (int i = 1; i <= m; i++) {
int u = g[i].u, v = g[i].v, w = g[i].val;
res += UnionSet(u, v, w);
}
return res;
}
void MakeSet () {
for (int i = 1; i <= n; i++) fa[i] = i;
}
转载请注明原文地址:https://blackberry.8miu.com/read-34647.html