Codeforces 806 D. Perishable Roads Dijkstra
原文链接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的更多相关文章
- Codeforces 806 D.Prishable Roads
Codeforces 806 D.Prishable Roads 题目大意:给出一张完全图,你需要选取其中的一些有向边,连成一个树形图,树形图中每个点的贡献是其到根节点路径上每一条边的边权最小值,现在 ...
- Codeforces 191C Fools and Roads(树链拆分)
题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...
- [CF773D]Perishable Roads
[CF773D]Perishable Roads 题目大意: 一个\(n(n\le2000)\)个点的完全图\(G\),定义\(d(x)\)为生成树上点\(x\)到根路径上的最小边权.问图\(G\)的 ...
- Codeforces.567E.President and Roads(最短路 Dijkstra)
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...
- ROADS+dijkstra的灵活运用+POJ
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10742 Accepted: 3949 Descriptio ...
- Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥
原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...
- codeforces 711D D. Directed Roads(dfs)
题目链接: D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 711 D. Directed Roads (DFS判环)
题目链接:http://codeforces.com/problemset/problem/711/D 给你一个n个节点n条边的有向图,可以把一条边反向,现在问有多少种方式可以使这个图没有环. 每个连 ...
- Codeforces 746 G. New Roads
题目链接:http://codeforces.com/contest/746/problem/G mamaya,不知道YY了一个什么做法就这样过去了啊 2333 首先我显然可以随便构造出一棵树满足他所 ...
随机推荐
- 解决log4j和self4j日志报错Could NOT find resource [logback.groovy]及Could NOT find resource [logback-test.xml]问题
事件背景: 我的log4j和self4j按照网上的配置,配置成功了,但是报错如下: 让我很是郁闷,于是找了一大圈........ 解决方案: 总结来说就是:log4j.properties和logba ...
- selenium之css定位小结
前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...
- Spring 5 WebFlux
作者: 一字马胡 转载标志 [2017-11-26] 更新日志 日期 更新内容 备注 2017-11-26 新建文章 Spring 5 WebFlux demo Reactor Spring 5的一大 ...
- 8大排序之Python实现 冒泡排序优化
1.冒泡排序(从大到小):交换发生在内部循环 稳定的排序 冒泡排序的平均时间复杂度是O(n2),最好的时间复杂度是O(n),最坏的时间复杂度是O(n2),空间复杂度为O(1) 冒泡排序的优化在于did ...
- Confluence 6 SQL Server 测试你的数据库连接
在你的数据库设置界面,有一个 测试连接(Test connection)按钮可以检查: Confluence 可以连接你的数据库服务器 数据库字符集和隔离级别是正确的 你的数据库用户有正确的数据库权限 ...
- Confluence 6 让 Jira 应用停止发送通知到 Confluence
你可能希望仅仅配置 Confluence 在 workbox 中仅仅显示自己的通知,禁用在 workbox 中显示从 Jira 来的通知.有可能这个 Jira 的应用已经通过应用链接功能正确链接到 C ...
- Confluence 6 导入模板的定义
模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...
- 移动端touchstart,touchmove,touchend
近段时间使用html5开发一个公司内部应用,而触摸事件必然是移动应用中所必须的,刚开始以为移动设备上或许也会支持鼠标事件,原来是不支持的,好在webkit内核的移动浏览器支持touch事件,并且打包成 ...
- 【JDK】JDK模块化(1)-为什么要模块化
Java9发布已经有一年了,跟Java8相比,从目录对比就看得出来差别相当大. 实际上Java9最大的变化就是JDK模块化(Modular). 那么,模块化的目的是什么呢? 官方的说法是: 之前版本的 ...
- Java 本周四、五的相关研究——Excel 的文件管理(数据库初步)
日期:2018.9.28 星期五 博客期:013 说到这里,就二话不多说了!这次研习的是与Excel表相关联的方法 1.导入jar包(需要自己下载) 2.AccountManager类的实现(关键看非 ...