Ice_cream’s world II - HDU 2121 - 最小树形图

题目

  http://acm.hdu.edu.cn/showproblem.php?pid=2121

题意

  给你n个点和m条有向边,问最少能花费多少将它们连起来,如果能连起来输出需要的权值和根的序号,不能的话输出impossible

思路

  不定根最小树形图,虚拟出一个树根出来,令这个树根到每个点的权值为大于所有边的权值之和sum,在这里我令其到各点的权值为sum+1,最后如果存在最小树形图的话在输出权值的时候减去sum+1就可以了。此时所对应的树根就是和虚拟树根相连的那个点。

实现

  在写题的过程中WA了很多遍,检查来检查去没有发现问题。后来试了一组有环的数据发现权值没问题,根错了。

  原来是在定根的时候,我一开始的思路是pos = v-1,然后在输出的时候就直接printf一下pos,在无环也就是不需要更新图的时候这样的确是对的,但是一旦图被更新,这样一来点和点之间的对应关系就错了。

  所以正确的方法应该是通过edge的下标减去边数m来确定,也就是pos = i,然后在输出的时候printf("%lld %d\n", ans - sum, pos - m);

代码

//
//  main.cpp
//  L
//
//  Created by LucienShui on 2017/5/11.
//  Copyright © 2017年 LucienShui. All rights reserved.
//#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#define memset(a,b) memset(a,b,sizeof(a))
#define ull unsigned long long
#define ll long longusing namespace std;#define maxn 1008struct {int u,v;ll w;
}edge[maxn*20];int n, m, tmp, pos, pre[maxn], vis[maxn], id[maxn];
ll sum, in[maxn];
const int INF = 0x3f3f3f3f;ll directed_MST(int root, int n, int m) {ll ans = 0;while(true) {for (int i = 0; i < n; i++) in[i] = INF;for (int i = 0; i < m; i++) {int u = edge[i].u, v = edge[i].v;if (u != v && edge[i].w < in[v]) {in[v] = edge[i].w;pre[v] = u;if (u == root) {pos = i;/*pos = v-1*/}}}for(int i=0 ; i<n ; i++)if (in[i] == INF && i!=root) return -1;int cnt = 0;memset(id,-1);memset(vis,-1);in[root] = 0;for(int i=0 ; i<n ; i++) {ans += in[i];int v = i;while(vis[v] != i && id[v] == -1 && v!=root) {vis[v] = i;v = pre[v];}if(v != root && id[v] == -1) {for(int u = pre[v] ; u!=v ; u = pre[u])id[u] = cnt;id[v] = cnt++;}}if(cnt == 0) break;for(int i=0 ; i<n ; i++) if(id[i] == -1) id[i] = cnt++;for(int i=0 ; i<m ; i++) {int 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].w -= in[v];}n = cnt;root = id[root];}return ans;
}int main() {
#ifndef ONLINE_JUDGEfreopen("/home/lucienshui/Desktop/in", "r", stdin);
#endifwhile(~scanf("%d%d", &n, &m)) {sum = 0;for(int i=0 ; i<m ; i++) {scanf("%d%d%lld", &edge[i].u, &edge[i].v, &edge[i].w);edge[i].u++, edge[i].v++;sum += edge[i].w;}sum++, tmp = m;for(int i=1 ; i<=n ; i++) {edge[tmp].u = 0;edge[tmp].v = i;edge[tmp++].w = sum;}ll ans = directed_MST(0,n+1,m+n);if(ans == -1 || ans - sum >= sum) puts("impossible");else printf("%lld %d\n", ans - sum, pos - m);putchar('\n');}return 0;
}

Ice_cream’s world II - HDU 2121 - 最小树形图相关推荐

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

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

  2. hdu 4966 最小树形图

    将每门课等级拆成0,1,2,3...a[i]个点,对每一个等级大于0的点向它低一级连边,权值为0[意思是,若修了level k.则level(0~k)都当做修了] 将输入的边建边,权值为money[i ...

  3. NOI数据结构:最小树形图

    最小树形图-朱刘算法详解 +例题解析 最小树形图-朱刘算法详解 +例题解析_pursuit的博客-CSDN博客_最小树形图 图论 -- 生成树 -- 最小树形图 图论 -- 生成树 -- 最小树形图_ ...

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

    题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...

  5. hdu 2121 Ice_cream’s world II

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

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

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

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

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

  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> # ...

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

    题目大意:有一个人,想学习N个科目,每个科目都有相应的层次 有M个课程,M个课程的要求是,你的第c个科目的层次要达到l1,才可以参加,参加完这个课程后,你需要缴费money,但你的第d个科目的层次会达 ...

最新文章

  1. 【F#2.0系列】概述
  2. php设计模式八-----装饰器模式
  3. 《鸿蒙理论知识02》HarmonyOS开发平台和工具
  4. [计算机网络][HTTP]
  5. redis密码设置、访问权限控制等安全设置
  6. 个人所得税计算及多人避税问题
  7. 强悍的 Linux —— 网络
  8. 漫画算法python篇pdf_漫画算法:小灰的算法之旅(Python篇)(全彩)
  9. mysql软件可行性分析报告_软件工程作业 图书馆管理系统可行性分析报告
  10. 华为防火墙笔记-网络地址转化NAT
  11. 创新科技 新BMW 7系 有你夫复何求
  12. 手机软件测试wifi需要注意哪些问题,WiFi工作原理、测试及生产注意事项
  13. OTL,OCL,BTL电路的性能特点和差别
  14. Flutter中AspectRatio、Card 卡片组件
  15. 蓝桥杯 土地的面积计算
  16. 域名备案、服务器备案和网站备案有什么区别?
  17. python中常用的转义字符
  18. 杭电-1878 欧拉回路
  19. pycharm快捷键及中文说明【使用翻译工具一条一条翻译】
  20. [STM32F103C8] 做一个U盘

热门文章

  1. 信息安全工程师备考——信息系统安全工程(自用笔记)
  2. CISP备考-信息安全保障
  3. 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(3)
  4. 发布会后荣耀50系列热度为何反升?
  5. go每日新闻--2020-10-01
  6. VR虚拟技术快速发展 天眼查数据显示近8成VR相关企业成立在5年以内
  7. tableau 链接MySQL8.0报错[MySQL][ODBC 8.0(w) Driver]Can‘t connect to MySQL server on ‘192.168.1.3‘ (10061
  8. uni-app判断设备是否为 iPhone
  9. 记一次fineBI的增量删除更新BUG
  10. 宝塔 Nginx 反代相关技巧以及反代 Cloudflare 站点