제출 #93247

#제출 시각아이디문제언어결과실행 시간메모리
93247SamAndHard route (IZhO17_road)C++17
52 / 100
691 ms98848 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 5003;

int n;
vector<int> a[N];

int ans[N][N];

int d[N], maxd[N];;
void dfs0(int x, int p)
{
    if (x == p)
        d[x] = 0;
    else
        d[x] = d[p] + 1;
    maxd[x] = d[x];
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (h == p)
            continue;
        dfs0(h, x);
        maxd[x] = max(maxd[x], maxd[h]);
    }
}

void dfs(int x, int p, int dd, int pp)
{
    int max1 = 0, max2 = 0;
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (h == p)
            continue;
        int t = (maxd[h] - d[x]);
        if (t > max1)
        {
            max2 = max1;
            max1 = t;
        }
        else if (t > max2)
            max2 = t;
    }
    int q1 = 0, q2 = 0;
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (h == p)
            continue;
        int t = (maxd[h] - d[x]);
        if (t == max1)
            q1++;
        if (t == max2)
            q2++;
    }
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (h == p)
            continue;
        int t = (maxd[h] - d[x]);
        if (max1 == max2)
            dfs(h, x, max(dd, max1), pp);
        else
        {
            if (t == max1)
                dfs(h, x, max(dd, max2), pp);
            else
                dfs(h, x, max(dd, max1), pp);
        }
    }
    ans[pp][x] = dd * d[x];
}

int main()
{
    //freopen("input2.txt", "r", stdin);
    cin >> n;
    for (int i = 0; i < n - 1; ++i)
    {
        int x, y;
        cin >> x >> y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    for (int x = 1; x <= n; ++x)
    {
        if (a[x].size() == 1)
        {
            dfs0(x, x);
            dfs(x, x, 0, x);
        }
    }
    int maxu = -1;
    for (int x = 1; x <= n; ++x)
    {
        if (a[x].size() > 1)
            continue;
        for (int y = 1; y <= n; ++y)
        {
            if (a[y].size() > 1)
                continue;
            maxu = max(maxu, ans[x][y]);
        }
    }
    int q = 0;
    for (int x = 1; x <= n; ++x)
    {
        if (a[x].size() > 1)
            continue;
        for (int y = 1; y <= n; ++y)
        {
            if (a[y].size() > 1 || x == y)
                continue;
            if (ans[x][y] == maxu)
                ++q;
        }
    }
    cout << maxu << ' ' << q / 2 << endl;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

road.cpp: In function 'void dfs0(int, int)':
road.cpp:18:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
road.cpp: In function 'void dfs(int, int, int, int)':
road.cpp:31:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
road.cpp:46:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
road.cpp:57:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...