Codeforces 806 D.Prishable Roads

题目大意:给出一张完全图,你需要选取其中的一些有向边,连成一个树形图,树形图中每个点的贡献是其到根节点路径上每一条边的边权最小值,现在你需要求出每一个点作为根得到的树形图的贡献之和最小值。

解题思路:不难发现,最终答案一定是一条链挂着一个菊花的形态,且一定存在一种最优解菊花和链相连的边是权值最小的边, 如果不是,那么最小的边在链上可以直接把其它边免费挂到它下面,更优,如果最小边在菊花上,那么菊花上的其它边接在最小的边下面形成新的菊花会更优。那么我们可以把所有边权都减去最小的边权 \(\min\) ,现在我们要最小话根到这条最小的边的这条链上的边权之和。可以归纳证明这条链从最小边到根的路径上除了第一条边和第二条边的边权递增,那么这些边的贡献就是边权,可以直接跑最短路,而对于起始的那两条边,分类讨论一下那条边权值更大用一个超级源建两种边即可。跑不加优化的 Dijstra的复杂度是 \(O(n^2)\)

code

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf ((ll)(1e17))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T & x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
#define int ll
const int N = 2005;
int a[N*N*2], b[N*N*2], head[N], nxt[N*N*2], cnt;
int w[N][N], dis[N], now[N], tag[N], vis[N], n, S;
inline void add(int x, int y, int z){
a[++cnt] = y, b[cnt] = z, nxt[cnt] = head[x], head[x] = cnt;
}
signed main(){
read(n), S = n + 1; int Minedge = inf;
for(int i = 1; i < n; i++)
for(int j = i + 1; j <= n; j++)
read(w[i][j]), w[j][i] = w[i][j], Minedge = Min(w[i][j], Minedge);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) if(i != j){
add(i, j, w[i][j] -= Minedge);
if(!w[i][j]) tag[i] = 1, add(S, i, 0);
}
memset(now, 0x3f, sizeof(now));
for(int i = 1; i <= n; i++) if(!tag[i]){
for(int j = 1; j <= n; j++)
if(!tag[j] && i != j) now[j] = Min(now[j], w[i][j] << 1); }
for(int i = 1; i <= n; i++) add(S, i, now[i]);
memset(dis, 0x3f, sizeof(dis)), dis[S] = 0;
for(int k = 1; k <= n; k++){
int mn = inf, u = 0;
for(int i = 1; i <= n + 1; i++)
if(!vis[i] && dis[i] < mn) mn = dis[i], u = i;
vis[u] = 1;
for(int p = head[u]; p; p = nxt[p])
if(dis[u] + b[p] < dis[a[p]]) dis[a[p]] = dis[u] + b[p];
}
for(int i = 1; i <= n; i++)
printf("%lld\n", dis[i] + (n - 1) * Minedge);
return 0;
}

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

  1. Codeforces 806 D. Perishable Roads Dijkstra

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF806D.html 题目传送门 - CF806D 题意 给定一个 n 个点的无向完全图,每一条边有一定的边权. ...

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

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

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

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

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

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

  5. Codeforces 746 G. New Roads

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

  6. codeforces 1141G Privatization of Roads in Treeland

    题目链接:http://codeforces.com/contest/1141/problem/G 题目大意: 给你一个无向连通图.每条边都有颜色,如果存在一个点的临边中有超过两条边颜色相同,这个点就 ...

  7. Codeforces 543.B Destroying Roads

    B. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. 【CodeForces】671 D. Roads in Yusland

    [题目]D. Roads in Yusland [题意]给定n个点的树,m条从下往上的链,每条链代价ci,求最少代价使得链覆盖所有边.n,m<=3*10^5,ci<=10^9,time=4 ...

  9. Codeforces 583 DIV2 Asphalting Roads 模拟

    原题链接:http://codeforces.com/problemset/problem/583/A 题意: 很迷很迷,表示没看懂..但是你看样例就秒懂了 题解: 照着样例模拟就好 代码: #inc ...

随机推荐

  1. 【BZOJ】4316: 小C的独立集 静态仙人掌

    [题意]给定仙人掌图,求最大独立集(选择最大的点集使得点间无连边).n<=50000,m<=60000. [算法]DFS处理仙人掌图 [题解]参考:[BZOJ]1023: [SHOI200 ...

  2. 论文里有公式?用texlive+texstudio(windows下)

    要写论文了,但论文里有一大堆公式,感觉很麻烦,经过询问同学知道有tex这么个东西,可以像写代码一样写论文,许多论文的格式都有相关的模板,所以学习一下,这里记录一下环境安装. texlive和texst ...

  3. DNSLOG在渗透测试中的玩法儿

    首先了解一下DNS是啥??? DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读 ...

  4. Codeforces Round #441 (Div. 2)

    Codeforces Round #441 (Div. 2) A. Trip For Meal 题目描述:给出\(3\)个点,以及任意两个点之间的距离,求从\(1\)个点出发,再走\(n-1\)个点的 ...

  5. ubuntu中安装软件包问题 ------有一些软件包无法被安装。如果您用的是 unstable 发行版。。。

    在ubuntu中安装软件包提示 有一些软件包无法被安装.如果您用的是 unstable 发行版,这也许是因为系统无法达到您要求的状态造成的.该版本中可能会有一些您需要的软件包尚未被创建或是它们已被从新 ...

  6. js事件、事件委托

    事件流 事件流:页面中接收事件的顺序: IE的事件流是冒泡流,其他的浏览器是捕获流,如下图: DOM事件流 DOM 事件流同时支持这两种事件流,并且规定DOM任何事件流都包含三个阶段:事件捕获阶段.处 ...

  7. 调用HTMLTestRunner生产的报告内容为空解决办法

    开始代码如下,生成报告内容为空: #coding=utf-8 import unittest,time,reimport requestsimport jsonimport HTMLTestRunne ...

  8. apache 各种配置

    //apache 的网站配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf -->在编辑这个文件前需要去httpd.conf把这个文件的注释 ...

  9. [ python ] 软件开发规范

    在python开发中,我们建议采用如下规范: soft/ ├── bin # 程序执行文件目录 │   ├── __init__.py │   └── start.py # 程序开始执行脚本文件 ├─ ...

  10. 在 ASP.NET Core 具体使用文档

    https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/hosting?tabs=aspnetcore2x