HDU 1233 还是畅通工程 [最小生成树]
来源:互联网 发布:淘宝整机能买吗 编辑:程序博客网 时间:2024/05/11 15:35
Description
最小生成树
Algorithm
Kruskal算法
V1.0
用C++实现了 UnionFind类
不过用JAVA写这题就一直WA,不知如何是好
Prim算法
V2.0
JAVA没加优化,过了
Code
V2.0
import java.util.Arrays;import java.util.Scanner;public class Main { public static void main(String[] args) { final int INF = Integer.MAX_VALUE / 2; Scanner cin = new Scanner(System.in); for (;;) { int n = cin.nextInt(); if (n == 0) break; int m = n * (n - 1) / 2; int[][] cost = new int[n][n]; for (int i = 0; i < n; i++) { Arrays.fill(cost[i], INF); } for (int i = 0; i < m; i++) { int a = cin.nextInt() - 1; int b = cin.nextInt() - 1; int c = cin.nextInt(); cost[a][b] = cost[b][a] = c; } int[] minCost = new int[n]; Arrays.fill(minCost, INF); boolean[] used = new boolean[n]; Arrays.fill(used, false); minCost[0] = 0; int ans = 0; for(;;) { int v = -1; for (int u = 0; u < n; u++) { if (!used[u] && (v == -1 || minCost[u] < minCost[v])) v = u; } if (v == -1) break; used[v] = true; ans += minCost[v]; for (int u = 0; u < n; u++) { minCost[u] = Math.min(minCost[u], cost[v][u]); } } System.out.println(ans); } }}
V1.0
#include <cstdio>#include <algorithm>using namespace std;struct Edge{ int u, v, cost;};const int MAX_M = 109 * 108 / 2;const int MAX_N = 100 + 9;int n;bool comp(Edge a, Edge b){ if (a.cost < b.cost) return true; else return false;}struct UnionFind{ int n; int par[MAX_N]; int rank[MAX_N]; UnionFind(int nn) { n = nn; for (int i = 0; i < n; i++) { par[i] = i; rank[i] = i; } } int find(int x) { if (par[x] == x) return x; else return par[x] = find(par[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (rank[x] < rank[y]) { par[x] = y; } else { par[y] = x; if (rank[x] == rank[y]) rank[x]++; } } bool same(int x, int y) { return find(x) == find(y); } void print() { for (int i = 0; i < n; i++) { printf("%d ", par[i]); } } int total() { int s = 0; for (int i = 0; i < n; i++) { if (par[i] == i) s++; } return s; }};void solve(){ int m = n * (n - 1) / 2; Edge edges[MAX_M]; for (int i = 0; i < m; i++) { scanf("%d%d%d", &edges[i].u, &edges[i].v, &edges[i].cost); } sort(edges, edges + m, comp); UnionFind unionFind(n); int ans = 0; for (int i = 0; i < m; i++) { if (!unionFind.same(edges[i].u - 1, edges[i].v - 1)) { unionFind.unite(edges[i].u - 1, edges[i].v - 1); ans += edges[i].cost; } } printf("%d\n", ans);}int main(){ for (;;) { scanf("%d", &n); if (n == 0) break; solve(); }}
0 0
- hdu 1233 还是畅通工程(Prim最小生成树)
- hdu 1233 还是畅通工程(最小生成树Kruskal)
- hdu 1233 还是畅通工程(最小生成树)
- hdu 1233 最小生成树 "还是畅通工程"
- hdu 1233 还是畅通工程--最小生成树prim
- HDU 1233 还是畅通工程 最小生成树
- hdu 1233 还是畅通工程【最小生成树入门】
- HDU 1233 还是畅通工程---prim求最小生成树
- hdu 1233 还是畅通工程(最小生成树)
- HDU-1233 还是畅通工程 最小生成树Prime
- HDU 1233 还是畅通工程(最小生成树)
- [ACM] hdu 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程(最小生成树)
- hdu 1233 还是畅通工程(图论:最小生成树)
- HDU 1233 还是畅通工程 最小生成树入门
- HDU 1233 还是畅通工程(最小生成树入门)
- HDU 1233 还是畅通工程 最小生成树
- Excel自动更新时间
- 高并发量网站解决方案
- Oracle创建表空间、创建用户以及授权、查看权限
- 类型的判定
- iOS动态性runtime初探(改私有变量,私有方法)
- HDU 1233 还是畅通工程 [最小生成树]
- 多线程-wait(针对OBJECT对象锁的方式)
- 分治法在归并排序和快速排序中的应用
- ListView的setOnClickListener失效
- 数位dp
- 使用python将KDD-99中的文本替换为数值形式
- ImageView你不知道的一些问题
- Java 里http协议的get请求
- poj 3252 Round Number 数位dp