原文链接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 开始跑一下最短路就好了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=2005;
const int INF=2e9;
int n;
int g[N][N];
int tag[N],near[N];
int vis[N];
LL dis[N];
int main(){
n=read();
int Min=INF;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++){
g[i][j]=g[j][i]=read();
Min=min(Min,g[i][j]);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j){
g[i][j]-=Min;
if (!g[i][j])
tag[i]=tag[j]=1;
}
int S=n+1;
for (int i=1;i<=n;i++)
g[S][i]=g[i][S]=tag[i]?0:INF;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j){
if (tag[i])
near[j]=1;
if (tag[j])
near[i]=1;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&near[j])
g[S][i]=g[i][S]=min(g[i][S],2*g[i][j]);
for (int i=1;i<=n+1;i++)
vis[i]=0,dis[i]=1e15;
dis[S]=0;
for (int i=1;i<=n+1;i++){
int x=0;
for (int j=1;j<=n+1;j++)
if (!vis[j]&&(x==0||dis[j]<dis[x]))
x=j;
vis[x]=1;
for (int j=1;j<=n+1;j++)
if (!vis[j]&&dis[j]>dis[x]+g[x][j])
dis[j]=dis[x]+g[x][j];
}
for (int i=1;i<=n;i++)
cout << dis[i]+(LL)Min*(n-1) << endl;
return 0;
}

  

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. WebService生成XML文档时出错。不应是类型XXXX。使用XmlInclude或SoapInclude属性静态指定非已知的类型。

    情况是SingleRoom和DoubleRoom是Room类的子类.在WebService中有一个方法是返回Room类. public Room Get(int roomId) { return Ro ...

  2. [nodejs]er_bad_field_error NaN in where clause

    1 前言 nodejs 运行时,出现以下情况er_bad_field_error NaN in where clause. 2 分析 原来是userid = NAN传进来了,生成userid时出错了. ...

  3. 利用zxing生成二维码

    使用zxing类库可以很容易生成二维码QRCode,主要代码如下: private Bitmap createQRCode(String str,int width,int height) { Bit ...

  4. 微信video最上层解决问题

    /*  http://blog.csdn.net/kepoon/article/details/53608190  */ //x5-video-player-type="h5" x ...

  5. C# 我的小画板

    我的画板 先看实现图 实现过程 using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  6. PHP7运行环境搭建(Windows7)

    注:本文来源于<    PHP7运行环境搭建(Windows7)   > php7号称能直追facebook的HHVM,为了体验一把传说中的高性能,我特意在本地电脑上尝试着安装了php7, ...

  7. verilog 异步复位代码

    module reset_sync (input clk, input reset_in, output reset_out); (* ASYNC_REG = 'b1; (* ASYNC_REG = ...

  8. SpringCloud路由(网关)

    springcloud网关接口就类似于转发 搭建路由网关项目(ZuulDemo) 1.创建pom.xml <project xmlns="http://maven.apache.org ...

  9. cf581F 依赖背包+临时数组 好题

    这题得加个临时数组才能做.. /* 给定一棵树,树节点可以染黑白,要求叶子节点黑白平分 称连接黑白点的边为杂边,求使得杂边最少的染色方 那么设dp[i][j][0|1]表示i子树中有j个叶子节点,i染 ...

  10. mysql登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问 对于出现拒绝访问root用户的解决方案错 ...