hdu 5483 Nux Walpurgis(最小生成树+dfs)
来源:互联网 发布:网络配音培训班 编辑:程序博客网 时间:2024/06/05 03:33
题目链接:hdu 5483 Nux Walpurgis
解题思路
先求一下最小生成树。然后枚举起点,遍历整棵树,维护树边能被替换的最小权值。
代码
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 3005;const int inf = 0x3f3f3f3f;struct Edge { int u, v, w; Edge(int u = 0, int v = 0, int w = 0): u(u), v(v), w(w) {} bool operator < (const Edge& a) const { return w < a.w; }};int N, F[maxn], W[maxn], T[maxn];int E, first[maxn], jump[maxn<<1], linker[maxn<<1], idx[maxn<<1];vector<Edge> S;vector<int> D[maxn];void addEdge(int u, int v, int w) { jump[E] = first[u]; linker[E] = v; idx[E] = w; first[u] = E++;}int find (int x) { return x == F[x] ? x : F[x] = find(F[x]); }void set(int u, int v, int w) { if (u > v) swap(u, v); D[u][v-u-1] = w;}int get (int u, int v) { if (u > v) swap(u, v); return D[u][v-u-1];}void init () { S.clear(); scanf("%d", &N); int x; for (int i = 0; i < N; i++) { D[i].clear(); for (int j = 1; j < N-i; j++) { scanf("%d", &x); D[i].push_back(x); S.push_back(Edge(i, i+j, x)); } }}void miniTree () { E = 0; memset(first, -1, sizeof(first)); for (int i = 0; i < N; i++) F[i] = i; int n = N; sort(S.begin(), S.end()); for (int i = 0; i < S.size(); i++) { int u = S[i].u, v = S[i].v; if (find(u) != find(v)) { F[find(u)] = find(v); addEdge(u, v, n); addEdge(v, u, n); set(u, v, inf); W[n--] = S[i].w; if (n == 1) break; } }}int dfs (int u, int fa, int rt, int id, int w) {// printf("rt=%d fa=%d u=%d %d %d\n", rt, fa, u, id, w); for (int i = first[u]; i + 1; i = jump[i]) { int v = linker[i]; if (v == fa) continue; w = min(w, dfs(v, u, rt, idx[i], get(rt, v))); } T[id] = min(T[id], w); return w;}int main () { int cas; scanf("%d", &cas); while (cas--) { init(); miniTree(); for (int i = 1; i <= N; i++) T[i] = inf; for (int i = 0; i < N; i++) dfs(i, i, i, 1, inf); int ans = 0; for (int i = 2; i <= N; i++) { if (T[i] != W[i]) ans++; } printf("%d\n", ans); } return 0;}
0 0
- hdu 5483 Nux Walpurgis(最小生成树+dfs)
- HDU 5483 Nux Walpurgis 图的最小生成树中必要的边的数目 动态MST问题
- BestCoder,Nux Walpurgis,最小生成树必要边的数目
- HDOJ 5483 Nux Walpurgis
- HDU 5483(Nux Walpurgis-一定在MST中的边)
- HDU 2489 DFS枚举+最小生成树
- HDU 4081 最小生成树+dfs
- HDU 5723(最小生成树+dfs)
- 最小生成树+dfs
- hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
- HDU 2489 Minimal Ratio Tree(dfs+最小生成树)
- hdu-2489 Minimal Ratio Tree(DFS+最小生成树)
- hdu 5723 Abandoned country 最小生成树+DFS
- hdu 5723 最小生成树+dfs (多校)
- HDU 5723 Abandoned country (最小生成树+dfs)
- HDU 5723 Abandoned country [最小生成树+dfs]
- HDU 5723 Abandoned country(最小生成树+DFS)
- SQL Server数据库大型应用解决方案总结
- C++ string流介绍
- MacOS下IDEA的快捷键大全
- java序列化相关总结
- Spring @Transactional (一)
- hdu 5483 Nux Walpurgis(最小生成树+dfs)
- Currency Exchange(Bellman-Ford)
- 21-读《马云,我的人生哲学》记录二
- 第一章.《计算机系统漫游》
- HDU1004
- windows 编程 问题(1)
- centos kvm部署和常用命令
- Linux下gedit中文显示乱码
- 黑马程序员—集合框架共性方法与迭代器