LightOJ - 1040 Donation(最小生成树)
来源:互联网 发布:免费的mac清理软件 编辑:程序博客网 时间:2024/04/30 07:07
题目大意:给你一个邻接矩阵,表示两点之间的花费,现在问,花费总和-最小生成树的值
如果最小生成树不存在,另外输出
解题思路:模版题
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int MAXNODE = 110;const int MAXEDGE = 50010;typedef int Type;struct Edge{ int u, v; Type d; Edge() {} Edge(int u, int v, Type d): u(u), v(v), d(d) {}}E[MAXEDGE];int n, m, tot, sum, cas = 1;int f[MAXNODE];Type maxcost[MAXNODE][MAXNODE];vector<Edge> G[MAXNODE];//初始化并查集和最小生成树的边void init() { scanf("%d", &n); for (int i = 0; i < n; i++) { f[i] = i; G[i].clear(); } sum = m = 0; int val; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { scanf("%d", &val); if (val != 0) { E[m++] = Edge(i, j, val); sum += val; } }}int find(int x) { return x == f[x] ? x : f[x] = find(f[x]);}bool cmp(const Edge &a, const Edge &b) { return a.d < b.d;}//dfs找路径最大值,maxcost[i][j]维护的是树上的i到j点的路径上,最长的那条边的权值 void dfs(int s, int u, Type Max, int fa) { maxcost[s][u] = max(maxcost[s][u], Max); for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].v; if (v == fa) continue; double tmp = max(Max, G[u][i].d); dfs(s, v, tmp, u); }}//Kruskal找到最小生成树,并将最小生成树记录下来,以便后面用来求两点之间的最长边void solve() { sort(E, E + m, cmp); Type Sum = 0; int num = 0; for (int i = 0; i < m; i++) { int fx = find(E[i].u); int fy = find(E[i].v); if (fx != fy) { f[fx] = fy; Sum += E[i].d; G[E[i].u].push_back(E[i]); swap(E[i].u, E[i].v); G[E[i].u].push_back(E[i]); num++; } } if (num != n - 1) printf("Case %d: %d\n", cas++ , -1); else printf("Case %d: %d\n", cas++, sum - Sum);}int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0;}
0 0
- LightOJ - 1040 Donation(最小生成树)
- LightOj 1040 - Donation
- LightOJ - 1040 Donation
- LightOJ 1040 – Donation 【Prim】
- LightOJ 1002 最小生成树
- LightOJ 1029 【最小生成树】
- LightOJ 1123 - Trail Maintenance (最小生成树)
- 二 LightOJ 1002 最小生成树
- LightOJ - 1041 Road Construction(最小生成树)
- LightOJ - 1041 Road Construction(最小生成树)
- lightoj 1123(增量最小生成树)
- Light OJ 1040 Donation
- LightOj 1123-Trail Maintenance(最小生成树:神级删边)
- LightOJ - ???? 最短修复路线(最小生成树)
- LightOJ -1029--Civil and Evil Engineer(最小生成树&&最大生成树)
- LightOJ-1065-生成树
- LightOJ-1123-生成树
- lightOJ 1002 最小瓶颈树 ..
- Java(JVM)内存模型和垃圾回收监控与调整
- 实现 strcpy
- oracle ORA-01033 错误的解决方案
- leetcode-Swap Nodes in Pairs
- 牛客网 | 从上往下打印二叉树
- LightOJ - 1040 Donation(最小生成树)
- 第4讲项目2------第三小节 转换为华氏温度值
- developer.android.com test 01
- php网站开发学习平台
- 数据结构与算法(C语言描述)——单链表
- mysql 学习记录(二十一)--调整linux I/O以提高mysql运行效率
- 动态调用CSS文件 JS文件的方法
- 字符编码笔记:ASCII,Unicode和UTF-8
- 面向对象(上)