File size: 4,206 Bytes
1fd0050
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m;
    cin >> n >> m;
    vector<int> a(10);
    for (int i = 0; i < 10; i++) cin >> a[i];
    vector<vector<int>> adj(n + 1), rev(n + 1);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        rev[v].push_back(u);
    }
    vector<int> outdeg(n + 1);
    for (int i = 1; i <= n; i++) outdeg[i] = adj[i].size();
    for (int i = 1; i <= n; i++) {
        sort(adj[i].begin(), adj[i].end(), [&](int x, int y) {
            if (outdeg[x] != outdeg[y]) return outdeg[x] < outdeg[y];
            return x < y;
        });
    }
    vector<bool> vis(n + 1, false);
    stack<int> order;
    function<void(int)> dfs1 = [&](int u) {
        vis[u] = true;
        for (int v : adj[u]) if (!vis[v]) dfs1(v);
        order.push(u);
    };
    for (int i = 1; i <= n; i++) if (!vis[i]) dfs1(i);
    fill(vis.begin(), vis.end(), false);
    vector<int> scc(n + 1, -1);
    int scc_cnt = 0;
    function<void(int, int)> dfs2 = [&](int u, int id) {
        vis[u] = true;
        scc[u] = id;
        for (int v : rev[u]) if (!vis[v]) dfs2(v, id);
    };
    while (!order.empty()) {
        int u = order.top(); order.pop();
        if (!vis[u]) {
            dfs2(u, scc_cnt);
            scc_cnt++;
        }
    }
    vector<int> scc_size(scc_cnt, 0);
    for (int i = 1; i <= n; i++) scc_size[scc[i]]++;
    vector<set<int>> dag_set(scc_cnt);
    for (int u = 1; u <= n; u++) {
        int s1 = scc[u];
        for (int v : adj[u]) {
            int s2 = scc[v];
            if (s1 != s2) {
                dag_set[s1].insert(s2);
            }
        }
    }
    vector<vector<int>> dag(scc_cnt);
    vector<int> dag_indeg(scc_cnt, 0);
    for (int i = 0; i < scc_cnt; i++) {
        for (int j : dag_set[i]) {
            dag[i].push_back(j);
            dag_indeg[j]++;
        }
    }
    queue<int> q;
    vector<int> temp_indeg = dag_indeg;
    vector<int> topo;
    for (int i = 0; i < scc_cnt; i++) if (temp_indeg[i] == 0) q.push(i);
    while (!q.empty()) {
        int i = q.front(); q.pop();
        topo.push_back(i);
        for (int j : dag[i]) {
            temp_indeg[j]--;
            if (temp_indeg[j] == 0) q.push(j);
        }
    }
    vector<long long> reach_size(scc_cnt, 0);
    for (int idx = topo.size() - 1; idx >= 0; idx--) {
        int i = topo[idx];
        reach_size[i] = scc_size[i];
        for (int j : dag[i]) {
            reach_size[i] += reach_size[j];
        }
    }
    vector<int> candidates;
    for (int i = 1; i <= n; i++) {
        if (reach_size[scc[i]] == n) {
            candidates.push_back(i);
        }
    }
    sort(candidates.begin(), candidates.end(), [&](int x, int y) {
        if (outdeg[x] != outdeg[y]) return outdeg[x] < outdeg[y];
        return x < y;
    });
    vector<char> visited(n + 1, 0);
    vector<int> path;
    function<bool(int, int)> dfs = [&](int u, int count) -> bool {
        path.push_back(u);
        visited[u] = 1;
        bool res = (count == n);
        if (!res) {
            for (int v : adj[u]) {
                if (visited[v] == 0) {
                    if (dfs(v, count + 1)) {
                        res = true;
                        break;
                    }
                }
            }
        }
        if (!res) {
            path.pop_back();
            visited[u] = 0;
        }
        return res;
    };
    vector<int> the_path;
    bool found_ham = false;
    for (int start : candidates) {
        fill(visited.begin(), visited.end(), 0);
        path.clear();
        if (dfs(start, 1)) {
            the_path = path;
            found_ham = true;
            break;
        }
    }
    if (found_ham && the_path.size() == static_cast<size_t>(n)) {
        cout << n << '\n';
        for (size_t i = 0; i < the_path.size(); i++) {
            cout << the_path[i];
            if (i + 1 < the_path.size()) cout << " ";
            else cout << '\n';
        }
    } else {
        int some = 1;
        if (!candidates.empty()) some = candidates[0];
        cout << 1 << '\n' << some << '\n';
    }
    return 0;
}