結果
問題 | No.92 逃走経路 |
ユーザー |
![]() |
提出日時 | 2017-03-03 21:43:02 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 4 ms / 5,000 ms |
コード長 | 2,283 bytes |
コンパイル時間 | 1,131 ms |
コンパイル使用メモリ | 162,052 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-22 05:17:42 |
合計ジャッジ時間 | 2,028 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
ソースコード
#include "bits/stdc++.h"using namespace std;//現在と次の頂点のbooleanbool now[2000];bool nextt[2000];int main(){//n=town, //m=load//k回分の料金int N, M, K;cin >> N >> M >> K;//a,b,c=a街,b街,kの配列vector<int> a(M), b(M), c(M);for (int i = 0; i < M; i++){cin >> a[i] >> b[i] >> c[i];//a=1引いておくと後で計算楽になる。a[i]--; b[i]--;}//料金がdであとで比較のために作る。vector<int> d(K);for (int i = 0; i < K; i++){cin >> d[i];}for (int i = 0; i < N; i++){//現在の道の状況をtrueであとで再帰的にtrueのやつをカウントしておく。now[i] = true;nextt[i] = false;}//全文探索はfor文重ねて、if_continueで枝切りで行ける。//料金所*道の数だけループ回す。for (int i = 0; i < K; i++){//道の数for (int j = 0; j < M; j++){//counterが違うものであれば、続ける。if (c[j] != d[i]) continue;//a街とb街をtureにする。両方とも//前からのものがtrueで料金所の街なら、次の街もtrueになるnextt[a[j]] |= now[b[j]];nextt[b[j]] |= now[a[j]];}//ここの行がポイントで、最初の料金所に引っかからなかった街Nはここでnexttがないので振り落とされる。//つまり、nexttはデフォルトがfalseなので、それに引っかからないbooleanはこの段階で落としてしまう。for (int j = 0; j < N; j++){ //1からNまで振られている。jは街の数で何もtrueがなければそこで終わりになる。//ここでどんどん枝刈りでふるいに落とされる。2つ枝刈り。booleanでnow[j] = nextt[j];nextt[j] = false;}}int count = 0;//最後にnowcountがtrueのものが可能性のある街になる。for (int i = 0; i < N; i++){if (now[i]){count++;}}cout << count << endl;//N以上ないから、そこで虱潰しにtrueのみ、出力する。for (int i = 0; i < N; i++){if (now[i]){//マイナスでなければ、街の数を出して、スペース。マイナスは最終行を意味するので、そこではendlで対処if (--count) cout << (i + 1) << " ";else cout << (i + 1) << endl;}}}