HDU 1863 畅通工程——最小生成树
2017-05-15 11:32
316 查看
直接用Kruskal算法求解,用cnt记录最小生成树的边数进行判断
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 110;
int par[maxn], ran[maxn];
void init(int m) {
for (int i = 0; i <= m; i++) {
par[i] = i, ran[i] = 0;
}
}
int seek(int x) {
if (par[x] == x) return x;
else return par[x] = seek(par[x]);
}
void unite(int x, int y) {
x = seek(x), y = seek(y);
if (x == y) return;
if (ran[x] == ran[y]) par[x] = y;
else {
par[y] = x;
if (ran[x] == ran[y]) ran[x]++;
}
}
struct Edge {
int u, v, cost;
bool operator < (const Edge &another) const {
return cost < another.cost;
}
}edge[maxn*maxn];
int main()
{
int m, n, u, v, cost;
while (scanf("%d %d", &n, &m) == 2 && n) {
for (int i = 1; i <= n; i++) {
scanf("%d %d %d", &u, &v, &cost);
edge[i].u = u, edge[i].v = v, edge[i].cost = cost;
}
sort(edge + 1, edge + 1 + n);
init(m);
int cnt = 0, ans = 0;
for (int i = 1; i <= n; i++) {
if (cnt == m - 1) break;
if (seek(edge[i].u) != seek(edge[i].v)) {
cnt++;
ans += edge[i].cost;
unite(edge[i].u, edge[i].v);
}
}
if (cnt == m - 1) printf("%d\n", ans);
else printf("?\n");
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 110;
int par[maxn], ran[maxn];
void init(int m) {
for (int i = 0; i <= m; i++) {
par[i] = i, ran[i] = 0;
}
}
int seek(int x) {
if (par[x] == x) return x;
else return par[x] = seek(par[x]);
}
void unite(int x, int y) {
x = seek(x), y = seek(y);
if (x == y) return;
if (ran[x] == ran[y]) par[x] = y;
else {
par[y] = x;
if (ran[x] == ran[y]) ran[x]++;
}
}
struct Edge {
int u, v, cost;
bool operator < (const Edge &another) const {
return cost < another.cost;
}
}edge[maxn*maxn];
int main()
{
int m, n, u, v, cost;
while (scanf("%d %d", &n, &m) == 2 && n) {
for (int i = 1; i <= n; i++) {
scanf("%d %d %d", &u, &v, &cost);
edge[i].u = u, edge[i].v = v, edge[i].cost = cost;
}
sort(edge + 1, edge + 1 + n);
init(m);
int cnt = 0, ans = 0;
for (int i = 1; i <= n; i++) {
if (cnt == m - 1) break;
if (seek(edge[i].u) != seek(edge[i].v)) {
cnt++;
ans += edge[i].cost;
unite(edge[i].u, edge[i].v);
}
}
if (cnt == m - 1) printf("%d\n", ans);
else printf("?\n");
}
return 0;
}
相关文章推荐
- 畅通工程 hdu 1863 最小生成树+并查集 浙大计算机研究生复试上机考试-2007年
- HDU1863 畅通工程 【最小生成树Prim】
- hdu 1863畅通工程(prim最小生成树)
- HDU 1863 畅通工程 (最小生成树是否存在)
- hdu 1863 畅通工程 (最小生成树kruskal 算法)
- HDU 1863 畅通工程(最小生成树prim算法)
- hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)&&prim普利姆算法实现
- hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。
- 【最小生成树+kruskal】杭电 hdu 1863 畅通工程
- HDU 1863 畅通工程 (最小生成树) By-小宇
- hdu 1863 畅通工程 (并查集+最小生成树)
- HDU 1863-畅通工程(最小生成树)
- 【最小生成树】hdu 1863 畅通工程
- hdu1863 畅通工程(最小生成树)
- HDU 1863 畅通工程 (最小生成树)
- hdu1863-畅通工程-最小生成树
- hdu 1863 畅通工程(最小生成树,基础)
- 【最小生成树+Prim】杭电 hdu 1863 畅通工程
- HDU 1863 畅通工程 prim算法 最小生成树
- hdu 1863 畅通工程-----------最小生成树模板题