結果
問題 | No.92 逃走経路 |
ユーザー | RCCW |
提出日時 | 2017-03-03 21:43:02 |
言語 | C++11 (gcc 11.4.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,812 KB |
testcase_02 | AC | 1 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 4 ms
6,940 KB |
testcase_06 | AC | 3 ms
6,944 KB |
testcase_07 | AC | 3 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 3 ms
6,940 KB |
testcase_11 | AC | 4 ms
6,944 KB |
testcase_12 | AC | 4 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,944 KB |
testcase_16 | AC | 3 ms
6,944 KB |
testcase_17 | AC | 3 ms
6,944 KB |
testcase_18 | AC | 4 ms
6,940 KB |
testcase_19 | AC | 3 ms
6,940 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; //現在と次の頂点のboolean bool 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; } } }