hdu2121 Ice_cream's world II
给一个有向图,求最小树形图,并输出根节点
\(n\leq10^3,\ m\leq10^4\)
最小树形图
对于求无根最小树形图,可以建一个虚拟节点,连向其他所有节点,权值为 \(\inf\) ,最后的答案即为 \(ans-\inf\) 。无解当且仅当 \(ans>\inf\times2\)
至于求根节点,可以考虑记下前驱为虚拟节点的节点,但由于节点编号不断改变,因此只需记下连接两个节点的边即可。
时间复杂度 \(O(nm)\)
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010, inf = 2e6;
int n, m, tmp, val[maxn], tid[maxn], pre[maxn], vis[maxn];
struct edges {
  int u, v, w;
} e[maxn * 11];
void edmonds() {
  int ans = 0, pos;
  while (1) {
    memset(tid, 0, sizeof tid);
    memset(vis, 0, sizeof vis);
    for (int i = 1; i < n; i++) {
      val[i] = 1 << 30;
    }
    for (int i = 1; i <= m; i++) {
      int u = e[i].u, v = e[i].v;
      if (u != v && e[i].w < val[v]) {
        val[v] = e[i].w, pre[v] = u;
        if (u == n) pos = i;
      }
    }
    for (int i = 1; i < n; i++) {
      if (val[i] > 1e9) {
        puts("impossible\n"); return;
      }
    }
    int tot = 0;
    for (int i = 1; i < n; i++) {
      int u = i;
      ans += val[i];
      while (u != n && !tid[u] && vis[u] != i) {
        vis[u] = i, u = pre[u];
      }
      if (u != n && !tid[u]) {
        tid[u] = ++tot;
        for (int v = pre[u]; u != v; v = pre[v]) {
          tid[v] = tot;
        }
      }
    }
    if (!tot) break;
    for (int i = 1; i <= n; i++) {
      if (!tid[i]) tid[i] = ++tot;
    }
    for (int i = 1; i <= m; i++) {
      int u = e[i].u, v = e[i].v;
      e[i].u = tid[u], e[i].v = tid[v];
      if (u != v) e[i].w -= val[v];
    }
    n = tot;
  }
  ans -= inf;
  if (ans > inf) {
    puts("impossible\n");
  } else {
    printf("%d %d\n\n", ans, pos - m + tmp - 1);
  }
}
int main() {
  while (~scanf("%d %d", &n, &m)) {
    for (int i = 1; i <= m; i++) {
      scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
      e[i].u++, e[i].v++;
    }
    for (int i = 1; i <= n; i++) {
      e[m + i].u = n + 1, e[m + i].v = i, e[m + i].w = inf;
    }
    m += (tmp = n), n++;
    edmonds();
  }
  return 0;
}
												
											hdu2121 Ice_cream's world II的更多相关文章
- HDU2121 Ice_cream’s world II —— 最小树形图 + 不定根 + 超级点
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (J ...
 - hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , ...
 - hdu2121 Ice_cream’s world II 最小树形图(难)
		
这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++ ...
 - HDU2121 Ice_cream’s world II (最小树形图)
		
在建图的时候对原图进行加边 建立一个超级源点~ #include<cstdio> #include<algorithm> #include<cstring> usi ...
 - 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 ...
 - HDU 2121 Ice_cream’s world II 不定根最小树形图
		
题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
 - hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】
		
称号:pid=2121" target="_blank">hdoj 2121 Ice_cream's world II 题意:题目是一道躶题,给n个点,m条边的有向 ...
 - HDU 2121 Ice_cream’s world II 最小树形图 模板
		
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
 - Ice_cream’s world II(最小树形图,加虚点)
		
Ice_cream’s world II http://acm.hdu.edu.cn/showproblem.php?pid=2121 Time Limit: 3000/1000 MS (Java/O ...
 
随机推荐
- 洛谷P4590 [TJOI2018]游园会(状压dp LCS)
			
题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...
 - Java synchronized 线程同步
			
同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...
 - Android IPC机制(三)使用AIDL实现跨进程方法调用
			
上一篇文章中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户 ...
 - (转载)解决NVIDIA显卡驱动“没有找到兼容的图形硬件”的问题
			
(转载)解决NVIDIA显卡驱动“没有找到兼容的图形硬件”的问题 原出处:http://www.cnblogs.com/longdouhzt/archive/2012/02/28/2370660.ht ...
 - springmvc复习笔记----springmvc姓名年龄例子:RequestParam  试水
			
继续 继上节http://www.cnblogs.com/tk55/p/6652394.html 重要部分颜色突出 结构 包 web.xml 乱码处理方面设置 <url-pattern>* ...
 - Debian, Ubuntu linux安装openjdk
			
sudo apt-get install openjdk-8-jre 这只是单单安装了jre而已,不要安装这个 安装下面这个就行了 sudo apt-get install openjdk-8-jdk ...
 - [20181124]关于降序索引问题2.txt
			
[20181124]关于降序索引问题2.txt --//链接:blog.itpub.net/267265/viewspace-2221425/,探讨降序索引中索引的键值.--//实际上使用函数sys_ ...
 - sql-server的添加数据库文件(日志数据)以及收缩数据库文件(日志数据)
			
环境: SSMS sql-server2016 一.为数据库添加数据文件 添加日志数据文件 以下是添加数据文件和日志文件的代码 ALTER DATABASE [joinbest] ADD FILE ( ...
 - spring-AOP(面向切面编程)-xml方式配置
			
AOP是针对面向对象编程的一种补充,有时使用面向对象不能很好完成一些额外的功能业务时,可以采用AOP来进行补充. AOP术语: 切面(Aspect) 切面是用于编写切面逻辑的一个类,这个类很类似于JD ...
 - C#解析XML 例子二
			
<checkResult> <item> <fmId>XX0001</fmId> <fmItemId>20000RT</fmItemI ...