Codeforces 911F 贪心

Codeforces 911F 贪心_第1张图片

Codeforces 911F 贪心_第2张图片

分析:先求出树的直径,以这个直径上的节点作为主干。

假设两个端点分别为x,y,求其他任意叶子节点z到另一个叶子节点的最长距离即为max{ d(x,z), d(y,z) }

该解法的正确性我无法给出证明,但画图看看应该就不难理解的。

代码如下:

#include 
#include 
#include 
using namespace std;

typedef long long LL;
const int maxn = 2e5+10;
struct answer{
   int u,v;
}a[maxn];
vector G[maxn];
bool v[maxn];
int d[maxn],pre[maxn];
int n,tot;
int root,leaf;
LL ans;

void init(){
   for (int i=1; i<=n; i++) G[i].clear();
   tot = 0;
   int u,v;
   for (int i=1; idr) {
            a[tot].u = leaf;
            a[tot].v = x;
            ans += df;
        }
        else {
            a[tot].u = root;
            a[tot].v = x;
            ans += dr;
        }
        tot++;
    }
}

int main(){
    while (scanf("%d",&n)==1){
        init();

        d[0] = 0;
        root = 1;
        dfs(root,0);
        for (int i=1; i<=n; i++) if (d[root]


你可能感兴趣的:(ACM入门,贪心)