题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible。

题解:最小树形图+虚根
还好做了这题,板子有点问题。

由于要求以哪一个为根权值和最小,枚举肯定不行,考虑加点,也就是虚根。

对于这个虚根,我们将其连向每一个点,权值为原本所有边权和+1,这样是为了避免出现有两条或以上连向虚根的边。

跑完朱刘之后,最小树形图出来了,如何求起点呢?从虚根入手,新加入的边的编号-m就是点的编号。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
const int MAXM = 40010;
struct Edge {int u, v;int cost;
}edge[MAXM];
int pre[MAXN], id[MAXN], vis[MAXN];
int in[MAXN], pos;
int zhuliu(int rt, int n, int m) {int u, v;int res = 0;while (1) {for (int i = 0; i < n; i++) in[i] = INF;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 == rt) pos = i;   //起点}for (int i = 0; i < n; i++)if (i != rt && in[i] == INF) return -1;//不存在最小树形图int tn = 0;memset(id, -1, sizeof(id));memset(vis, -1, sizeof(vis));in[rt] = 0;for (int i = 0; i < n; i++) {res += in[i];v = i;while (vis[v] != i && id[v] == -1 && v != rt) {vis[v] = i;v = pre[v];}if (v != rt && 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];//else swap(edge[i], edge[--m]);}n = tn;rt = id[rt];}return res;
}
int n, m;
int main() {while (~scanf("%d%d", &n, &m)) {int L = 0, sum = 0;for (int i = 1; i <= m; i++) {scanf("%d%d%d", &edge[L].u, &edge[L].v, &edge[L].cost);sum += edge[L++].cost;}sum++;for (int i = 0; i < n; i++) {edge[L].u = n;edge[L].v = i;edge[L++].cost = sum;}int ans = zhuliu(n, n + 1, L);if (ans == -1 || ans >= 2 * sum) puts("impossible");else printf("%d %d\n", ans - sum, pos - m);puts("");}return 0;
}

HDU 2121 Ice_cream’s world II (最小树形图+虚根)相关推荐

  1. HDU 2121 Ice_cream’s world II(最小树形图+虚根)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121        题意是有n个点(0--n-1),m条有向边,问以那个点作为起点使得最小生成树的权值 ...

  2. hdu 2121 Ice_cream’s world II

    无固定根节点的最小树形图,添加一个人工根节点,人工根节点到每个节点的权值sum>(所有边权值之和), 求出结果减去sum,只有人工根节点跟一个节点相连时才会有解,如果结果大于等于sum,则人工节 ...

  3. HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)

    题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要 ...

  4. hdu 2121 最小树形图 +虚根

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意: n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍 ...

  5. HDU 4009 Transfer water (最小树形图+虚根)

    题意:有一个村庄需要修建供水系统.每户居民的房子都有一个三维坐标,每户居民可以选择自己挖井或者从其他居民家里引水.挖水井和引水分别需要花费不同的钱.每户居民有一个意愿表,只愿意对表内的居民家供水.最后 ...

  6. hdu4966 最小树形图+虚根

    /* 辛辛苦苦调试半天, 过了样例,竟然没有ac!! 网上对比了ac代码,感觉添加一个虚根就能ac 但是想不明白为什么 */ /* 第二天想了下,知道了为什么wa:因为从等级0连到其他课程等级i的不止 ...

  7. HDU 4966 GGS-DDU(最小树形图)

    n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...

  8. hdu 4009 Transfer water(最小树形图模板)

    题目链接:点击打开链接 Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Ja ...

  9. GGS-DDU 【HDU - 4966】【最小树形图】

    题目链接 最小树形图讲解 一道最小树形图的裸题,我们只需要对于在同一学科的由高等级逐一指向低等级的边建为0权值即可,另外的边,建立成有向边即可. #include <iostream> # ...

最新文章

  1. jsonb 查询_如何使用IN运算符查询jsonb数组
  2. Mysql学习总结(41)——MySql数据库基本语句再体会
  3. RocketMQ类关系图之NameServer
  4. SQL Server中drop、truncate和delete语句的用法
  5. 作者:​那旭(1990-),女,中国医学科学院医学信息研究所研究实习员。
  6. unknow Unknown type name 'NSString'
  7. 如何使用 indent 美化你的代码
  8. 【idea基础知识】project structure中没有web 或没有spring
  9. 查看php文件的效果,HTML5的交互式动画效果文件夹预览查看特效
  10. 如何在VS2013中隐藏引用计数?
  11. 谷歌研发开源协议,助听器有望原生支安卓系统
  12. python代码求和_python求和代码
  13. 振铃效应与样点自适应补偿(Sample Adaptive Offset,SAO)技术
  14. 十四五规划下建筑企业智慧建造数字化转型规划战略
  15. 程序员如何阅读英文文档
  16. 物联网系列②——使用ESP8266与STM32进行物联网开发板设计
  17. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】
  18. mysql中+desc用法_mysql desc(DESCRIBE)命令实例讲解
  19. python穷举法列举_穷举法
  20. 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名

热门文章

  1. JavaScript 是世界上最好的语言?
  2. 1024,祝所有程序员节日快乐
  3. linux下组播遇到的问题及解决办法
  4. 如何高效学习 - 斯科特·扬
  5. 【学习方法】如何才能高效学习
  6. Android App包瘦身优化
  7. 代码补全快餐教程(1) - 30行代码见证奇迹
  8. Unity 3D基础入门编程_艾孜尔江撰稿
  9. python表白代码,照片隐藏表白话语
  10. 泉州信息工程学院 计算机考试,泉州信息工程学院教务网络管理系统成绩查询、网上选课查分登录入口...