首页 > 其他分享 >Codeforces 977 E1 Digital Village 贪心证明

Codeforces 977 E1 Digital Village 贪心证明

时间:2024-10-22 12:22:27浏览次数:7  
标签:977 包含 Codeforces 替换成 证明 Digital 顶点 最优 贪心

问题重述(原题简化得来):

给定一个简单联通无向图,包含n个顶点,每条边有一个正整数边权。定义两顶点距离为两顶点间路径最大边权的最小值。记k个顶点为特殊顶点,记f(i)为i顶点分别到k个顶点的k个距离中的最小距离,记score=f(1)+f(2)+...+f(n)。现在需要最小化score。则以下贪心算法是正确的:先找一个特殊顶点最小化score,然后在此基础上贪心地选下一个特殊顶点……直到选出k个特殊顶点为止,则这k个特殊顶点是最优的。

证明过程:

​对于该图,按照Kruskal算法求最小生成树的流程建reachability tree。在reachability tree上,假设我们有最优解S,|S|=k+1,以及最优解T,|T|=k。则我们总是可以构造一种过程,把S里面的其中k个顶点替换成T的k个顶点。

大致原理是:因为我们获得T这个最优解的贪心过程中有一系列最优解F(1),F(2),...,F(k),|F(i)|=i,并且显然集合差F(i+1)-F(i)恰好包含一个元素(一个叶节点),记这个元素为x。所以原来的问题就可以简化为:如果现在S里面的其中i个顶点已经能够替换成F(i)里的i个顶点,那么总是可以在S里面再找一个顶点,使得其可以替换成x。

如何找这个顶点?记S'=S-F(i),则从x不断向父节点行走,直到走到某个非叶顶点v,使得以v为根的子树的两个直接子树,一个包含x而不包含S'的任何元素,一个包含S'的至少一个元素而不包含x。令这两个子树分别为G和H,不妨令G包含x,H包含S'的一部分,设S'的这部分为S''。我们又可以证明,∀e∈S'',都可以把e替换为x。证明如下:记S'''=S''-{e}。若将S'''暂时去掉,则将e替换成x显然是更优或等优的,因为v为根的子树里只有e或只有x的时候,e或x是该子树规模为1的最优解(该子树外部的顶点无法影响内部,这部分证明略过),当S'''存在的时候,e在H内对于答案的贡献只会更低或不变(这部分证明也略过),因此把e替换成x仍然是更优或等优的。

Q.E.D.

欢迎挑错

标签:977,包含,Codeforces,替换成,证明,Digital,顶点,最优,贪心
From: https://www.cnblogs.com/SeaYellow/p/18492313

相关文章

  • Codeforces Round 980 (Div. 2)
    A-ProfitableInterestRatevoidsolve(){ cin>>n>>m; if(n>=m)cout<<n<<'\n'; else { intc=m-n; if(c>=n)cout<<"0\n"; elsecout<<n-c<<'\n'; } return;}B-Buyin......
  • 「题解」Codeforces Round 980 (Div. 2)
    before\(A\simD\)的题解A.ProfitableInterestRateProblemA.ProfitableInterestRateSol&Code数学题,有\(a-x\geqb-2x\),得\(x=b-a\)。特判\(a\geqb\)以及\(a<x\)的情况即可。#include<bits/stdc++.h>#defineM10001#defineN......
  • Educational Codeforces Round 165 (Rated for Div. 2) - VP记录
    A.TwoFriends一共只有两种情况:存在\(A\)的最好朋友是\(B\)且\(B\)的最好朋友是\(A\)的情况:此时只需邀请这两个人即可。不存在上述情况:设某个人\(A\)的最好朋友是\(B\),\(B\)的最好朋友是\(C\),这时邀请\(A,B,C\)三个人就可使\(A,B\)到场。根据上述两种情......
  • Codeforces Round 979 (Div. 2)
    CodeforcesRound979(Div.2)总结A首先第一位的贡献一定是\(0\),然后考虑接下来\(n-1\)位,我们可以把最大值和最小值放在第一位和第二位,这样贡献就是\((max-min)\times(n-1)\)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#includ......
  • 「题解」Codeforces Round 979 (Div. 2)
    before\(A\simD\)的题解A.AGiftFromOrangutanProblemA.AGiftFromOrangutanSol&Code\(c_i-b_i\)最大就是\(a\)的最大值减最小值。将\(a\)的最大值\(x\)和最小值\(y\)放到头两位即可得到答案\((x-y)(n-1)\)。#include<bits/stdc++.h>#defineM......
  • Codeforces Round 980 (Div. 2) C. Concatenation of Arrays
    题目:给定n个数组a1,a2,…,an。每个数组的长度都是2。因此,ai=[ai,1,ai,2]。你需要将这些数组连接成一个长度为2n的单一数组,以便使结果数组中的逆序数最小。注意,你不需要实际计算逆序的数量。更正式地说,你需要选择一个长度为n的排列p,使得数组b=[ap1,1,ap1,2,......
  • Codeforces Round 979 div2 个人题解(A~E)
    CodeforcesRound979div2个人题解(A~E)Dashboard-CodeforcesRound979(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#inc......
  • Codeforces Round 979 (Div. 2) C. A TRUE Battle
    题目链接:题目大意:Alice和Bob先后轮流向一串01字符串中加入or或and,前者想让结果为1后者想让结果为0,问Alice能不能赢。思路:对于相同的两个布尔值,or和and都不能改变它们,而对于Alice,他倾向于向01之间加入or,Bob则想加入and。一开始我想比较1和0的多少不就行了吗,但是不对,当你......
  • Codeforces Round 979 (Div. 2) B. Minimise Oneness
    题目链接:题目大意:构造长度为nnn的01字符串,使得全为零的子序列和至少有一个1的子序列的数量之差的绝对值最小。思路:很明显,所有子序列中不是全为0就是至少有一个1,所以算......
  • Codeforces Round 980 (Div. 2)
    糖丸了,什么沟史比赛A.ProfitableInterestRate初始有\(a\)个硬币,可以花费硬币开通盈利账户与非盈利账户开通盈利账户需要至少花费\(b\)个金币开通非盈利账户没有限制每在非盈利账户花费\(x\)元,盈利账户的限制\(b\)就减少\(2x\)元求最大的在盈利账户上的花......