原文链接https://www.cnblogs.com/zhouzhendong/p/CF806D.html

题目传送门 - CF806D

题意

  给定一个 n 个点的无向完全图,每一条边有一定的边权。

  对于它的一个生成树,我们定义一个节点的花费为该点到根的边权min 。

  一个生成树的权值为所有节点的花费之和。

  对于每一个节点,求出以他为根的最小生成树权值。

  $n\leq 2000$

题解

  首先,我们考虑找出权值最小的边。

  那么,一旦这条边被连到了根,剩下的所有点直接连向它就好了。

  假设有一个根,那么最优解之一 一定长成这样:

  其中根为最上面那个点,黑色点的上面直接连接的边权值为 min 。

  我们将所有点的权值先减掉min 。

  这之后我们只需要求出“将根和任意一个连接 0 边的节点连通的最小花费”即可。

  

  考虑将从黑色节点到根的边权依次写出来,假设是 $w_1,w_2,w_3,\cdots ,w_n$ ,那么有这样一个性质:

  最优解之一 一定满足 $\forall i>1, w_i<w_{i+1}$ 。

  因为如果存在一个不满足的 $i$ ,我们可以直接把第 $i-1$ 个接上去,把第 $i$ 个接到黑点上面。

  对于第一条边,当然不需要满足。

  设一个超级源点 S ,使他免费连向所有与 0 边直接相连的点,并与其他点没有边。

  于是,对于任何一个点 x,对于它连向的任意一个与 0 边直接相连的点 y ,将 d[x][S] 变成 min(d[x][S],2*d[x][y]) 即可。

  最后只要从 S 开始跑一下最短路就好了。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. LL read(){
  5. LL x=0,f=0;
  6. char ch=getchar();
  7. while (!isdigit(ch))
  8. f|=ch=='-',ch=getchar();
  9. while (isdigit(ch))
  10. x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  11. return f?-x:x;
  12. }
  13. const int N=2005;
  14. const int INF=2e9;
  15. int n;
  16. int g[N][N];
  17. int tag[N],near[N];
  18. int vis[N];
  19. LL dis[N];
  20. int main(){
  21. n=read();
  22. int Min=INF;
  23. for (int i=1;i<=n;i++)
  24. for (int j=i+1;j<=n;j++){
  25. g[i][j]=g[j][i]=read();
  26. Min=min(Min,g[i][j]);
  27. }
  28. for (int i=1;i<=n;i++)
  29. for (int j=1;j<=n;j++)
  30. if (i!=j){
  31. g[i][j]-=Min;
  32. if (!g[i][j])
  33. tag[i]=tag[j]=1;
  34. }
  35. int S=n+1;
  36. for (int i=1;i<=n;i++)
  37. g[S][i]=g[i][S]=tag[i]?0:INF;
  38. for (int i=1;i<=n;i++)
  39. for (int j=1;j<=n;j++)
  40. if (i!=j){
  41. if (tag[i])
  42. near[j]=1;
  43. if (tag[j])
  44. near[i]=1;
  45. }
  46. for (int i=1;i<=n;i++)
  47. for (int j=1;j<=n;j++)
  48. if (i!=j&&near[j])
  49. g[S][i]=g[i][S]=min(g[i][S],2*g[i][j]);
  50. for (int i=1;i<=n+1;i++)
  51. vis[i]=0,dis[i]=1e15;
  52. dis[S]=0;
  53. for (int i=1;i<=n+1;i++){
  54. int x=0;
  55. for (int j=1;j<=n+1;j++)
  56. if (!vis[j]&&(x==0||dis[j]<dis[x]))
  57. x=j;
  58. vis[x]=1;
  59. for (int j=1;j<=n+1;j++)
  60. if (!vis[j]&&dis[j]>dis[x]+g[x][j])
  61. dis[j]=dis[x]+g[x][j];
  62. }
  63. for (int i=1;i<=n;i++)
  64. cout << dis[i]+(LL)Min*(n-1) << endl;
  65. return 0;
  66. }

  

Codeforces 806 D. Perishable Roads Dijkstra的更多相关文章

  1. Codeforces 806 D.Prishable Roads

    Codeforces 806 D.Prishable Roads 题目大意:给出一张完全图,你需要选取其中的一些有向边,连成一个树形图,树形图中每个点的贡献是其到根节点路径上每一条边的边权最小值,现在 ...

  2. Codeforces 191C Fools and Roads(树链拆分)

    题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...

  3. [CF773D]Perishable Roads

    [CF773D]Perishable Roads 题目大意: 一个\(n(n\le2000)\)个点的完全图\(G\),定义\(d(x)\)为生成树上点\(x\)到根路径上的最小边权.问图\(G\)的 ...

  4. Codeforces.567E.President and Roads(最短路 Dijkstra)

    题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...

  5. ROADS+dijkstra的灵活运用+POJ

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10742   Accepted: 3949 Descriptio ...

  6. Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  7. codeforces 711D D. Directed Roads(dfs)

    题目链接: D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. Codeforces 711 D. Directed Roads (DFS判环)

    题目链接:http://codeforces.com/problemset/problem/711/D 给你一个n个节点n条边的有向图,可以把一条边反向,现在问有多少种方式可以使这个图没有环. 每个连 ...

  9. Codeforces 746 G. New Roads

    题目链接:http://codeforces.com/contest/746/problem/G mamaya,不知道YY了一个什么做法就这样过去了啊 2333 首先我显然可以随便构造出一棵树满足他所 ...

随机推荐

  1. java中package指什么

    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间,类似C#的 namespace的作用,防止名字相同的类产生冲突. Java中的一个package(包)就是一个类库单元,包内包含有一组 ...

  2. ER/数据库建模工具之MySQL Workbench的使用

    参考:https://blog.csdn.net/soulandswear/article/details/60966808 待后续整理...

  3. GridView的stretchMode属性

    stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充剩余空间.参数stretchMode 可选值为:none,spacingWidth,columnWidth, spa ...

  4. @ModelAttribute设置request、response、session对象

    利用spring web提供的@ModelAttribute注解 放在类方法的参数前面表示引用Model中的数据 @ModelAttribute放在类方法上面则表示该Action类中的每个请求调用之前 ...

  5. ajax控件无法使用 iis配置及web修改(转载)

    1.Web.config配置问题:将Web.config中的相关节配置成如下,然后重新编译你的程序:<httpHandlers><remove verb="*" ...

  6. JUnit-三角形判断测试

    添加工具 1.添加JUnit测试工具: 使用eclipse自带的JUnit或者下载相关包.使用方式如下: 新建一个项目后,点击next出现以下界面: 选择添加JUnit 选择完成出现以下目录文件: p ...

  7. Confluence 6 整合到其他数据库

    这个文档描述了如何整合你的 Confluence 数据库从你已经存在的数据库上到其他的数据库.这个指南被用来指导你从使用评估数据库转移到使用生产数据库. 大数据量需要第三方的数据库整合工具. 本页面对 ...

  8. 使用Spring配置数据源JdbcTemplate

    c3p0作为演示 1.编写资源文件(db.properties) jdbc.user=root jdbc.password=root jdbc.jdbcUrl=jdbc:mysql://localho ...

  9. laravel CSRF 保护

    在开始之前让我们来实现上述表单访问伪造的完整示例,为简单起见,我们在路由闭包中实现所有业务代码: Route::get('task/{id}/delete', function ($id) { ret ...

  10. 最小标示法模板 poj1509

    最小标示法:给定一个字符串,不断将其最后一个字符放到开头,最终会得到n个字符串,称这n个字符串循环同构,这些字符串中字典序最小的一个,就是最小表示法 #include<iostream> ...