結果
| 問題 | No.1190 Points |
| コンテスト | |
| ユーザー |
ninoinui
|
| 提出日時 | 2020-08-22 14:13:59 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,414 bytes |
| 記録 | |
| コンパイル時間 | 10,098 ms |
| コンパイル使用メモリ | 281,060 KB |
| 最終ジャッジ日時 | 2025-01-13 08:32:22 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 11 WA * 11 TLE * 1 MLE * 2 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template<typename T> class Dijkstra {
public:
struct edge {
int to; T cost;
};
int V;
vector<vector<edge>> G;
vector<T> dist;
vector<int> pre;
using pti = pair<T,int>;
Dijkstra(int n) : V(n), G(V), dist(V, numeric_limits<T>::max()), pre(V) {}
void add(int u, int v, T cost) {
G.at(u).push_back((edge) {v, cost});
G.at(v).push_back((edge) {u, cost});
}
void solve(int s) {
priority_queue<pti, vector<pti>, greater<pti>> Q;
dist.at(s) = 0;
Q.push(pti(0, s));
while (!Q.empty()) {
pti p = Q.top();
Q.pop();
int v = p.second;
if (dist.at(v) < p.first) continue;
for (auto &w : G.at(v)) {
if (dist.at(w.to) > dist.at(v) + w.cost) {
dist.at(w.to) = dist.at(v) + w.cost;
pre.at(w.to) = v;
Q.push(pti(dist.at(w.to), w.to));
}
}
}
}
vector<int> route(int from, int to) {
vector<int> res;
while (true) {
res.push_back(to);
if (to == from) break;
to = pre.at(to);
}
reverse(res.begin(), res.end());
return res;
}
};
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int N, M, P, S, G;
cin >> N >> M >> P >> S >> G;
S--, G--;
vector<int> U(M), V(M);
for (int i = 0; i < M; i++) cin >> U.at(i) >> V.at(i), U.at(i)--, V.at(i)--;
Dijkstra<long> D(N);
for (int i = 0; i < M; i++) D.add(U.at(i), V.at(i), 1);
D.solve(S);
if (D.dist.at(G) % 2 != P % 2) return cout << -1 << "\n", 0;
auto R = D.route(S, G);
set<int> SE;
for (auto r : R) SE.insert(r);
Dijkstra<long> D2(N);
for (int i = 0; i < M; i++) {
if (SE.count(U.at(i)) && SE.count(V.at(i))) D2.add(U.at(i), V.at(i), 1);
else D2.add(U.at(i), V.at(i), 2);
}
auto D3 = D2;
D2.solve(S);
D3.solve(G);
set<int> SE2;
for (int i = 0; i < D2.dist.size(); i++) {
if (i == S) continue;
if (D2.dist.at(i) <= P) SE2.insert(i);
}
if (!SE2.size()) return cout << -1 << "\n", 0;
SE2.insert(S);
set<int> SE3;
for (int i = 0; i < D3.dist.size(); i++) {
if (i == G) continue;
if (D3.dist.at(i) <= P) SE3.insert(i);
}
if (!SE3.size()) return cout << -1 << "\n", 0;
SE3.insert(G);
set<int> ans;
for (auto s : SE2) if (SE3.count(s)) ans.insert(s);
if (!ans.size()) return cout << -1 << "\n", 0;
cout << ans.size() << "\n";
for (auto a : ans) cout << a + 1 << "\n";
}
ninoinui