HDU-2121-Ice_cream’s world II
ACM模版
描述
题解
朱刘算法,最小树形图,第一次做这个算法的题,感觉自己无知迷茫的眼神好萌,目前大致理解了原理,可是还停留在套模版的水平……甚至,连模版都套不好,/(ㄒoㄒ)/~~
代码
#include <iostream>
#include <cstring>using namespace std;/** 最小树形图* int型* 复杂度O(NM)* 点从0开始*/
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
const int MAXM = 11010;struct Edge
{int u, v, cost;
};Edge edge[MAXM];int pos;
int pre[MAXN], id[MAXN], visit[MAXN], in[MAXN];int zhuliu(int root, int n, int m)
{int res = 0, v;while (1){memset(in, 0x3f, sizeof(in));for (int i = 0; i < m; i++){if (edge[i].u != edge[i].v && edge[i].cost < in[edge[i].v]){pre[edge[i].v] = edge[i].u;in[edge[i].v] = edge[i].cost;if (edge[i].u == root){pos = i;}}}for (int i = 0; i < n; i++){if (i != root && in[i] == INF){return -1; // 不存在最小树形图}}int tn = 0;memset(id, -1, sizeof(id));memset(visit, -1, sizeof(visit));in[root] = 0;for (int i = 0; i < n; i++){res += in[i];v = i;while (visit[v] != i && id[v] == -1 && v != root){visit[v] = i;v = pre[v];}if (v != root && id[v] == -1){for (int u = pre[v]; u != v ; u = pre[u]){id[u] = tn;}id[v] = tn++;}}if (tn == 0){break; // 没有有向环}for (int i = 0; i < n; i++){if (id[i] == -1){id[i] = tn++;}}for (int i = 0; i < m; i++){v = edge[i].v;edge[i].u = id[edge[i].u];edge[i].v = id[edge[i].v];if (edge[i].u != edge[i].v){edge[i].cost -= in[v];}}n = tn;root = id[root];}return res;
}int main()
{int n, m;while (~scanf("%d%d", &n, &m)){int sum = 0;for (int i = 0; i < m; i++){scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].cost);edge[i].u++;edge[i].v++;sum += edge[i].cost;}sum++;// 增加超级节点0,节点0到其余各个节点的边权相同(此题中 边权要大于原图的总边权值)for (int i = m; i < m + n; i++){edge[i].u = 0;edge[i].v = i - m + 1;edge[i].cost = sum;}int ans = zhuliu(0, n + 1, m + n);// n+1为总结点数,m+n为总边数// ans代表以超级节点0为根的最小树形图的总权值,// 将ans减去sum,如果差值小于sum,说明节点0的出度只有1,说明原图是连通图// 如果差值>=sum,那么说明节点0的出度不止为1,说明原图不是连通图if (ans == -1 || ans - sum >= sum){puts("impossible");}else{printf("%d %d\n",ans - sum, pos - m);}puts("");}return 0;
}
参考
《最小树形图》
HDU-2121-Ice_cream’s world II相关推荐
- HDU 2121 Ice_cream’s world II(最小树形图+虚根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意是有n个点(0--n-1),m条有向边,问以那个点作为起点使得最小生成树的权值 ...
- HDU 2121 Ice_cream’s world II (最小树形图+虚根)
题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...
- HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)
题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要 ...
- hdu 2121 Ice_cream’s world II
无固定根节点的最小树形图,添加一个人工根节点,人工根节点到每个节点的权值sum>(所有边权值之和), 求出结果减去sum,只有人工根节点跟一个节点相连时才会有解,如果结果大于等于sum,则人工节 ...
- HDU2121:Ice_cream’s world II (虚根+有向图最小生成树)
Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu2121 Ice_cream's world II
hdu2121 Ice_cream's world II 给一个有向图,求最小树形图,并输出根节点 \(n\leq10^3,\ m\leq10^4\) 最小树形图 对于求无根最小树形图,可以建一个虚拟 ...
- HDU.1002 A + B Problem II
原题 HDU.1002 A + B Problem II 分类 杂题·大位整数运算 题意 计算从任意两个长度在1000以内的正整数的和. 输入/输出 要求与格式 输入内容 最开始一行开始输入样例数,对 ...
- hdu 5265 pog loves szh II STL
pog loves szh II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- HDU - 2122 Ice_cream’s world III
ice_cream's world becomes stronger and stronger; every road is built as undirected. The queen enjoys ...
- hdu 2121 最小树形图 +虚根
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍 ...
最新文章
- 探寻背后的机制化繁为简:网站程序升级不过是文件同步
- 苍狼敏捷方法核心 v1
- selenium webdriver 启动三大浏览器Firefox,Chrome,IE
- 小皮面板phpstudy的MYSQL服务无法启动_ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)
- (转)C++的 RTTI 概念和用途
- hdu 2489 Minimal Ratio Tree
- [bzoj 3594] [Scoi2014]方伯伯的玉米田
- 《尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通)》视频1
- Excel自动批量发邮件
- 我要偷偷的学Python,然后惊呆所有人(第一天)
- Systemverilog always_comb 过程块
- 区块链学习——HyperLedger-Fabric v0.6环境搭建详细过程
- NVIDIA NCCL 源码学习(六)- channel搜索
- 极路由 mysql_用极路由3和移动硬盘DIY时间胶囊TimeCapsule做备份
- 学生党必备读书笔记app推荐
- fmt:formatDate标签的输出格式
- 使用Selenium时,如何选择ChromeDriver驱动版本对应Chrome浏览器版本
- java.sql.SQLException: Parameter index out of range (4 number of parameters, which is 2).
- MultiValueMap
- String.format()的详细用法