提出 #61137117
ソースコード 拡げる
#include <bits/stdc++.h>
#include <atcoder/modint>
namespace {
using ModInt [[maybe_unused]] = atcoder::modint998244353;
using Num [[maybe_unused]] = long long int;
using Vec [[maybe_unused]] = std::vector<Num>;
using Set [[maybe_unused]] = std::set<Num>;
using Mset [[maybe_unused]] = std::multiset<Num>;
using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;
template<typename T>
using Q [[maybe_unused]] = std::queue<T>;
template<typename T>
using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
const std::vector<std::pair<Num, Num>> dyxs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
std::map<char, std::pair<Num, Num>> directions {{'D', {1, 0}}, {'U', {-1, 0}}, {'R', {0, 1}}, {'L', {0, -1}}};
template<typename T>
void print_oneline(const std::vector<T>& vec, std::ostream& os) {
const auto size = vec.size();
for(size_t i{0}; i<size; ++i) {
os << vec.at(i) << (((i+1) == size) ? '\n' : ' ');
}
}
template<typename T>
void print_each(const std::vector<T>& vec, std::ostream& os) {
const auto size = vec.size();
for(size_t i{0}; i<size; ++i) {
os << vec.at(i) << '\n';
}
}
}
Edges edges;
Num from {-1};
Num to {-1};
bool visit_dfs(Vec& seq, Set& seen, Set& req, Num current) {
Vec vs;
for(const auto& next : edges[current]) {
if (seen.contains(next)) {
continue;
}
vs.push_back(next);
}
if (vs.empty()) {
return req.empty();
}
for(const auto& next : vs) {
seq.push_back(next);
seen.insert(next);
bool found = req.contains(next);
if (found) {
req.erase(next);
}
if (visit_dfs(seq, seen, req, next)) {
return true;
}
if (found) {
req.insert(next);
}
seen.erase(next);
seq.pop_back();
}
return false;
}
void solve(std::istream& is, std::ostream& os) {
Num n, m;
is >> n >> m;
edges.resize(n);
Vec degs(n);
for(Num i{0}; i<m; ++i) {
Num a, b;
is >> a >> b;
--a;
--b;
edges.at(a).push_back(b);
edges.at(b).push_back(a);
degs.at(a) += 1;
degs.at(b) += 1;
}
if (n == 2) {
os << "2\n1 2\n";
return;
}
std::vector<Vec> ds(n);
for(Num i{0}; i<n; ++i) {
const auto d = degs.at(i);
ds.at(d).push_back(i);
}
Set seen;
Num init {0};
for(Num i{0}; i<n; ++i) {
if (!ds.at(i).empty()) {
init = ds.at(i).at(0);
break;
}
}
Vec ans {init};
seen.insert(init);
Set req;
for(const auto& v : edges[init]) {
req.insert(v);
}
visit_dfs(ans, seen, req, init);
os << ans.size() << "\n";
const auto size = ans.size();
for(size_t i{0}; i<size; ++i) {
os << (1 + ans.at(i)) << (((i+1) == size) ? '\n' : ' ');
}
}
int main(void) {
solve(std::cin, std::cout);
return 0;
}
提出情報
| 提出日時 |
|
| 問題 |
B - Hamiltonish Path |
| ユーザ |
zettsut |
| 言語 |
C++ 20 (gcc 12.2) |
| 得点 |
500 |
| コード長 |
3238 Byte |
| 結果 |
AC |
| 実行時間 |
115 ms |
| メモリ |
35240 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
500 / 500 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
sample_01.txt, sample_02.txt, sample_03.txt, sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| sample_01.txt |
AC |
1 ms |
3564 KiB |
| sample_02.txt |
AC |
1 ms |
3628 KiB |
| sample_03.txt |
AC |
1 ms |
3560 KiB |
| subtask_1_01.txt |
AC |
47 ms |
10656 KiB |
| subtask_1_02.txt |
AC |
14 ms |
5548 KiB |
| subtask_1_03.txt |
AC |
40 ms |
10636 KiB |
| subtask_1_04.txt |
AC |
46 ms |
9800 KiB |
| subtask_1_05.txt |
AC |
47 ms |
9692 KiB |
| subtask_1_06.txt |
AC |
71 ms |
14828 KiB |
| subtask_1_07.txt |
AC |
52 ms |
13304 KiB |
| subtask_1_08.txt |
AC |
48 ms |
13268 KiB |
| subtask_1_09.txt |
AC |
115 ms |
35240 KiB |
| subtask_1_10.txt |
AC |
16 ms |
5376 KiB |
| subtask_1_11.txt |
AC |
20 ms |
5648 KiB |
| subtask_1_12.txt |
AC |
1 ms |
3512 KiB |
| subtask_1_13.txt |
AC |
1 ms |
3700 KiB |