201912026-01-04 14:40:04hunzombiHírlánccpp17Elfogadva 80/80391ms41628 KiB
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> topo, group, group_size, memo;
vector<bool> visited;
vector<vector<int>> group_nodes, graph, r_graph, graph2;

void topoSort(int node) {
    visited[node] = true;
    for (int next : graph[node]) {
        if (!visited[next]) {
            topoSort(next);
        }
    }
    topo.push_back(node);
}

void dfs(int node, int group_id, vector<int>& comp) {
    group[node] = group_id;
    comp.push_back(node);
    for (int next : r_graph[node]) {
        if (group[next] == -1) {
            dfs(next, group_id, comp);
        }
    }
}

void dfs2(int node) {
    if (memo[node] != -1) return;
    memo[node] = 0;
    int sum = 0;
    for (int next : graph2[node]) {
        if (memo[next] == -1) {
            dfs2(next);
        }
        sum += memo[next];
    }
    memo[node] = sum + group_size[node];
}

int main()
{
    cin >> n;

    visited.assign(n + 1, false);
    group.assign(n + 1, -1);
    graph.assign(n + 1, vector<int>(0));
    r_graph.assign(n + 1, vector<int>(0));
    group_nodes.push_back(vector<int>(0));

    for (int i=1; i <= n; i++) {
        int u;
        cin >> u;
        graph[i].push_back(u);
        r_graph[u].push_back(i);
    }

    for (int i=1; i <= n; i++) {
        if (!visited[i]) {
            topoSort(i);
        }
    }

    reverse(topo.begin(), topo.end());
    int number_of_groups = 1;

    for (int node : topo) {
        if (group[node] == -1) {
            vector<int> components(0);
            dfs(node, number_of_groups++, components);
            group_nodes.push_back(components);
        }
    }

    group_size.assign(number_of_groups, 0);

    for (int g = 1; g < number_of_groups; g++) {
        group_size[g] = group_nodes[g].size();
    }

    graph2.assign(number_of_groups, vector<int>(0));
    memo.assign(number_of_groups, -1);

    for (int i=1; i <= n; i++) {
        for (int next : graph[i]) {
            if (group[i] != group[next]) {
                graph2[group[i]].push_back(group[next]);
            }
        }
    }

    int max_group = 0;

    for (int g = 1; g < number_of_groups; g++) {
        if (memo[g] == -1) {
            dfs2(g);
        }
        if (memo[g] > memo[max_group]) {
            max_group = g;
        }
    }

    cout << group_nodes[max_group][0] << ' ' << memo[max_group] << '\n';
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
subtask220/20
2Elfogadva3ms564 KiB
3Elfogadva3ms764 KiB
4Elfogadva3ms564 KiB
5Elfogadva2ms748 KiB
6Elfogadva3ms564 KiB
7Elfogadva2ms564 KiB
8Elfogadva3ms808 KiB
9Elfogadva3ms820 KiB
10Elfogadva2ms564 KiB
11Elfogadva3ms756 KiB
12Elfogadva3ms564 KiB
subtask318/18
13Elfogadva335ms25332 KiB
14Elfogadva300ms24748 KiB
15Elfogadva261ms24964 KiB
16Elfogadva264ms25680 KiB
17Elfogadva261ms29608 KiB
18Elfogadva351ms29112 KiB
19Elfogadva356ms29100 KiB
20Elfogadva275ms29100 KiB
21Elfogadva268ms35756 KiB
22Elfogadva250ms37928 KiB
subtask442/42
23Elfogadva1ms316 KiB
24Elfogadva3ms564 KiB
25Elfogadva3ms764 KiB
26Elfogadva3ms564 KiB
27Elfogadva2ms748 KiB
28Elfogadva3ms564 KiB
29Elfogadva2ms564 KiB
30Elfogadva3ms808 KiB
31Elfogadva3ms820 KiB
32Elfogadva2ms564 KiB
33Elfogadva3ms756 KiB
34Elfogadva3ms564 KiB
35Elfogadva335ms25332 KiB
36Elfogadva300ms24748 KiB
37Elfogadva261ms24964 KiB
38Elfogadva264ms25680 KiB
39Elfogadva261ms29608 KiB
40Elfogadva351ms29112 KiB
41Elfogadva356ms29100 KiB
42Elfogadva275ms29100 KiB
43Elfogadva268ms35756 KiB
44Elfogadva250ms37928 KiB
45Elfogadva358ms36000 KiB
46Elfogadva284ms37272 KiB
47Elfogadva286ms37552 KiB
48Elfogadva361ms37788 KiB
49Elfogadva286ms38304 KiB
50Elfogadva291ms39312 KiB
51Elfogadva379ms39576 KiB
52Elfogadva391ms39832 KiB
53Elfogadva293ms40348 KiB
54Elfogadva289ms41628 KiB