HDU-1301-Jungle Roads
2016-11-01 01:16
357 查看
ACM模版
描述
题解
模版题,就是英文有些长了,真咋呼人,看了好久没看懂……最小生成树。代码
#include <iostream> #include <cstring> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; /* * Prim求MST * 耗费矩阵cost[][],初始化为INF,标号从0开始,0 ~ n-1 * 返回最小生成树的权值,返回-1表示原图不连通 */ const int INF = 0x3f3f3f3f; const int MAXN = 27; bool vis[MAXN]; int lowc[MAXN]; int cost[MAXN][MAXN]; // 修正cost(添加边) void updata(int x, int y, int v) { cost[x - 1][y - 1] = v; cost[y - 1][x - 1] = v; return ; } int Prim(int cost[][MAXN], int n) // 0 ~ n - 1 { int ans = 0; memset(vis, false, sizeof(vis)); vis[0] = true; for (int i = 1; i < n; i++) { lowc[i] = cost[0][i]; } for (int i = 1; i < n; i++) { int minc = INF; int p = -1; for (int j = 0; j < n; j++) { if (!vis[j] && minc > lowc[j]) { minc = lowc[j]; p = j; } } if (minc == INF) { return -1; // 原图不连通 } ans += minc; vis[p] = true; for (int j = 0; j < n; j++) { if (!vis[j] && lowc[j] > cost[p][j]) { lowc[j] = cost[p][j]; } } } return ans; } int main(int argc, const char * argv[]) { int N; char village[2]; // 字符串读入防止缓冲区出问题 int num; int len; while (cin >> N && N != 0) { mem(cost, 0x3f); mem(vis, 0); for (int i = 1; i < N; i++) { scanf("%s%d", village, &num); int temp = village[0] - 'A' + 1; // cout << temp << '\n'; for (int j = 0; j < num; j++) { scanf("%s%d", village, &len); updata(temp, village[0] - 'A' + 1, len); } } int ans = Prim(cost, N); cout << ans << '\n'; } return 0; }
参考
《最小生成树(森林)》相关文章推荐
- hdu 1301 Jungle Roads
- hdu 1301 Jungle Roads
- hdu 1301 jungle roads
- hdu 1301 Jungle Roads (prim)
- hdu 1301 Jungle Roads
- hdu 1301 Jungle Roads(最小生成树kruskal)
- HDU-1301 Jungle Roads
- HDU 1301 Jungle Roads
- Hdu 1301 Jungle Roads
- HDU-1301 Jungle Roads(最小生成树[Prim])
- HDU 1301 Jungle Roads (Kruskal求最小生成树)
- HDU 1301 Jungle Roads
- HDU-1301 Jungle Roads 并查集/最小生成数
- HDU1301-Jungle Roads
- HDU 1301 Jungle Roads(裸最小生成树)
- HDU 1301 Jungle Roads(Kruskal算法)
- hdu 1301 Jungle Roads
- HDU 1301 && POJ 1251 jungle Roads
- Jungle Roads_hdu_1301(prim算法)
- hdu1301 Jungle Roads(kruskal 备忘)