[伯俊/C+]18352号特定の距離の都市を検索
11835 ワード
[伯俊/C+]18352号特定距离的城市检索
1.質問
一部の国では1番からN番までの都市とM本の一方通行道路が存在している.すべての道路の距離は1です.
このとき、ある都市Xから、到達可能なすべての都市において、最短距離Kのすべての都市の番号を出力するプログラムが作成される.また、出発都市Xから出発都市Xまでの最短距離は常に0であると仮定する.
例えば、N=4、K=2、X=1の場合、図形は以下のように組織されていると仮定する.
このとき1番都市から行ける都市のうち、最短距離が2の都市は4番都市しかありません.2番と3番の都市については最短距離が1なので出力しません.
2.入力
1行目は都市の個数N,道路の個数M,距離情報K,出発都市の番号Xを与える.(2≦N≦30000,1≦M≦100000,1≦K≦30000,1≦X≦N)2行目からM行を経て、2つの自然数A,Bをスペース基準で区切る.これは、A番都市からB番都市へ移動する一方通行道路があることを意味する.(1≦A,B≦N)セグメント,AとBは異なる自然数である.
3.出力
Xから到達可能な都市では最短距離Kの全ての都市の番号が1行ずつ昇順に出力される.
このとき到達可能な都市のうち,最短距離Kの都市が1つも存在しなければ−1を出力する.
4.解答
INF
に初期化し、複数のパスを開始する.route
配列が返され、k
と同じ値のインデックスが出力されます.5.最初のコードと異なる点
null
6.コード
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
int n, m, k, x;
vector<int> graph[300001];
int route[300001];
void dijkstra() {
queue<int> q;
q.push(x);
route[x] = 0;
while (!q.empty()) {
int node = q.front();
q.pop();
for (int i = 0; i < graph[node].size(); i++) {
int nextNode = graph[node][i];
if (route[nextNode] < INF) continue;
route[nextNode] = route[node] + 1;
q.push(nextNode);
}
}
}
void print() {
for (int i = 1; i <= n; i++) {
cout << route[i] << " ";
}
cout<<endl;
}
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n >> m >> k >> x;
fill_n(route, n + 1, INF);
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
graph[a].push_back(b);
}
dijkstra();
bool isEmpty = true;
for (int i = 1; i <= n; i++) {
if (route[i] == k) {
cout << i << endl;
isEmpty = false;
}
}
if (isEmpty) {
cout << -1;
}
}
Reference
この問題について([伯俊/C+]18352号特定の距離の都市を検索), 我々は、より多くの情報をここで見つけました https://velog.io/@e7838752/boj18352テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol