Description

Secsa最近对最小生成树问题特别感兴趣。他已经知道如果要去求出一个n个点、m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法。另外,他还知道,某一个图可能有多种不同的最小生成树。例如,下面图 3中所示的都是图 2中的无向图的最小生成树:

当然啦,这些都不是今天需要你解决的问题。Secsa想知道对于某一条无向图中的边AB,至少需要多少代价可以保证AB边在这个无向图的最小生成树中。为了使得AB边一定在最小生成树中,你可以对这个无向图进行操作,一次单独的操作是指:先选择一条图中的边 P1P2,再把图中除了这条边以外的边,每一条的权值都减少1。如图 4所示就是一次这样的操作:

Input

输入文件的第一行有3个正整数n、m、Lab分别表示无向图中的点数、边数、必须要在最小生成树中出现的AB边的标号。
接下来m行依次描述标号为1,2,3…m的无向边,每行描述一条边。每个描述包含3个整数x、y、d,表示这条边连接着标号为x、y的点,且这条边的权值为d。
输入文件保证1<=x,y<=N,x不等于y,且输入数据保证这个无向图一定是一个连通图。

Output

输出文件只有一行,这行只有一个整数,即,使得标号为Lab边一定出现最小生成树中的最少操作次数。

Sample Input

4 6 1
1 2 2
1 3 2
1 4 3
2 3 2
2 4 4
3 4 5

Sample Output

1

HINT

第1个样例就是问题描述中的例子。

1<=n<=500,1<=M<=800,1<=D<10^6

Source

day2

Solution

思路很神的一道题。

首先,其他所有边权值-1可以看做这条边+1。如果选定的边本来就在最小生成树上就不用管它。

如果不在MST上的话,就要考虑想办法让它在MST上。让它在MST上的条件是s,t两个联通块之间一定不存在权值比它更小的边。

对于所有比选定的边边权小的边,让它一定不出现在MST上的代价就是让它的边权变为选定的边权+1。问题就变成了选定一些边使得s和t不连通,且边权总和最小。然后就变成了最小割模型,用网络流来解决。

Code

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4.  
  5. #define maxn 510
  6. #define maxm 810
  7. #define R register
  8. #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
  9. #define inf 0x7fffffff
  10. int n;
  11. struct edge {int a, b, w; } ee[maxm];
  12. struct Edge {
  13. Edge *next, *rev;
  14. int to, cap;
  15. } *cur[maxn], *last[maxn], e[maxm << ], *ecnt = e;
  16. inline void link(R int a, R int b, R int w)
  17. {
  18. *++ecnt = (Edge) {last[a], ecnt + , b, w}; last[a] = ecnt;
  19. *++ecnt = (Edge) {last[b], ecnt - , a, }; last[b] = ecnt;
  20. }
  21. int s, t, dep[maxn], q[maxn], ans;
  22. inline bool bfs()
  23. {
  24. R int head = , tail = ;
  25. memset(dep, -, (n + ) << );
  26. dep[q[] = t] = ;
  27. while (head < tail)
  28. {
  29. R int now = q[++head];
  30. for (R Edge *iter = last[now]; iter; iter = iter -> next)
  31. if (iter -> rev -> cap && dep[iter -> to] == -)
  32. dep[q[++tail] = iter -> to] = dep[now] + ;
  33. }
  34. return dep[s] != -;
  35. }
  36. int dfs(R int x, R int f)
  37. {
  38. if (x == t) return f;
  39. R int used = ;
  40. for (R Edge* &iter = cur[x]; iter; iter = iter -> next)
  41. if (iter -> cap && dep[iter -> to] + == dep[x])
  42. {
  43. R int v = dfs(iter -> to, dmin(f - used, iter -> cap));
  44. iter -> cap -= v;
  45. iter -> rev -> cap += v;
  46. used += v;
  47. if (used == f) return f;
  48. }
  49. return used;
  50. }
  51. inline void dinic()
  52. {
  53. while (bfs())
  54. {
  55. memcpy(cur, last, sizeof cur);
  56. ans += dfs(s, inf);
  57. }
  58. }
  59. int main()
  60. {
  61. R int m, lab; scanf("%d%d%d", &n, &m, &lab);
  62. for (R int i = ; i <= m; ++i) scanf("%d%d%d", &ee[i].a, &ee[i].b, &ee[i].w);
  63. for (R int i = ; i <= m; ++i)
  64. if (ee[i].w <= ee[lab].w && i != lab)
  65. {
  66. link(ee[i].a, ee[i].b, ee[lab].w - ee[i].w + );
  67. link(ee[i].b, ee[i].a, ee[lab].w - ee[i].w + );
  68. }
  69. s = ee[lab].a; t = ee[lab].b;
  70. dinic();
  71. printf("%d\n", ans);
  72. return ;
  73. }

【BZOJ2521】 [Shoi2010]最小生成树的更多相关文章

  1. bzoj2521 [Shoi2010]最小生成树

    [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MB Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出 ...

  2. BZOJ2521:[SHOI2010]最小生成树(最小割)

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  3. BZOJ2521[Shoi2010]最小生成树——最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  4. 【BZOJ2521】[Shoi2010]最小生成树 最小割

    [BZOJ2521][Shoi2010]最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算 ...

  5. 【BZOJ-2521】最小生成树 最小割

    2521: [Shoi2010]最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 415  Solved: 242[Submit][Statu ...

  6. BZOJ 2521: [Shoi2010]最小生成树

    2521: [Shoi2010]最小生成树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 445  Solved: 262[Submit][Statu ...

  7. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  8. BZOJ 2521: [Shoi2010]最小生成树(最小割)

    题意 对于某一条无向图中的指定边 \((a, b)\) , 求出至少需要多少次操作.可以保证 \((a, b)\) 边在这个无向图的最小生成树中. 一次操作指: 先选择一条图中的边 \((u, v)\ ...

  9. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...

随机推荐

  1. spring boot-2.Hello world

    由于 个人习惯,我选择使用STS来作为开发工具.跳过手动构建spring boot 项目的环节,直接使用向导创建spring boot 项目. 1.创建spring boot项目 File ----& ...

  2. Spring(一)--Spring简介

    Spring简介 1. Spring的特点 Spring (春天,绿色)  容器 01.Java EE开发者的春天,大大简化了代码量 02.使用IOC来降低主业务之间的耦合度 03.使用AOP来降低主 ...

  3. LeetCode_9_回文数字

    回文数(LeetCode 9) 1.题目 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: - ...

  4. 搜索专题:问题 E: 挑战ACM迷宫

    这是往年校赛的一道题,最开始做这道题的时候还没有系统的学习过搜索,用了C语言学的回溯法尝试,毫无疑问的TLE: 学习了DFS之后,自己的剪枝功力不够,又是TLE,最后学了BFS之后,哇,终于做出来了, ...

  5. Jquery复习(二)之stop()易忘点

    jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法:$ ...

  6. 088、Docker 如何支持多种日志方案 (2019-05-10 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7762369.html   将容器日志发送到 STDOUT 和 STDERR 是Docker 的默认日志行为.实际上,Do ...

  7. qt QAbstractItemModel一些方法介绍

    一. virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::Edit ...

  8. Java的GUI框架如何选择? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot、BeautyEye框架(美观)?

    AWT 是swing的基础,运行良好,但缺少高级组件.如果您打算创建丰富的应用程序,那么AWT可能不是最好的方法.但是对于不需要丰富用户界面的较小gui应用程序来说.这可能非常适合,因为它是一个久经考 ...

  9. Wannafly挑战赛22 C 多项式(大数,多项式极限)

    链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  10. Spring mvc 搭建Mybatis

    本文建立在spring mvc已经搭建起来的基础上. 首先看要引入的jar包,其中高亮的是为了mybatis新引入的. <properties>       <spring.webm ...