博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 806 D.Prishable Roads
阅读量:5335 次
发布时间:2019-06-15

本文共 2198 字,大约阅读时间需要 7 分钟。

Codeforces 806 D.Prishable Roads

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

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

code

/*program by mangoyang*/#include
#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
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 llconst 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;}

转载于:https://www.cnblogs.com/mangoyang/p/10407137.html

你可能感兴趣的文章
BZOJ 1023: [SHOI2008]cactus仙人掌图
查看>>
BZOJ 5125: [Lydsy1712月赛]小Q的书架
查看>>
算法笔记--圆方树
查看>>
Codeforces 750 E New Year and Old Subsequence
查看>>
BZOJ 2301: [HAOI2011]Problem b
查看>>
BZOJ 3529: [Sdoi2014]数表
查看>>
BZOJ 2820 YY的GCD
查看>>
Codeforces 1148 E - Earth Wind and Fire
查看>>
Codeforces 1187 G - Gang Up
查看>>
Codeforces 1187 F - Expected Square Beauty
查看>>
2017 Chinese Multi-University Training, BeihangU Contest
查看>>
2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15) C - Cactus Jubilee
查看>>
2018-2019 XIX Open Cup, Grand Prix of Korea B - Dev, Please Add This!
查看>>
LightOJ - 1151 Snakes and Ladders
查看>>
Codeforces 1179 D - Fedor Runs for President
查看>>
HDU 6184 Counting Stars
查看>>
AtCoder Beginner Contest 133 F Colorful Tree
查看>>
算法笔记--BSGS && exBSGS 模板
查看>>
P5043 【模板】树同构([BJOI2015]树的同构)
查看>>
Codeforces 348 D - Turtles
查看>>