알고리즘 공부
백준 특정거리의 도시 찾기
컴퓨터과학
2023. 8. 4. 00:58
https://www.acmicpc.net/problem/18352
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
문제를 잘읽읍시다 마지막 출력 정렬... ㅋㅋ
#include <iostream>
#include <vector>
#include <queue>
#include<string>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#include<map>
#include<stack>
using namespace std;
struct Point {
int s, e, t, cnt, power;
char c;
};
void Prints(vector<vector<int>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<bool>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<char>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j];
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<vector<char>>>maps, int n, int m, int k) {
for (int t = 0; t < k; t++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[t][i][j];
}
cout << endl;
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<vector<bool>>>maps, int n, int m, int k) {
for (int t = 0; t < k; t++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[t][i][j];
}
cout << endl;
}
cout << endl;
}
cout << endl;
}
void Prints(vector<int>line, int n) {
for (int i = 0; i < n; i++) {
cout << line[i] << ",";
}
cout << endl;
}
void Prints(string str, int n) {
for (int i = 0; i < n; i++) {
cout << str[i] << ",";
}
cout << endl;
}
bool checkmaps(vector<vector<int>>maps, vector<vector<int>>anw, int n, int m) {
bool bCheck = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maps[i][j] != anw[i][j]) {
bCheck = true;
i = n + 1;
j = m + 1;
continue;
}
}
}
return bCheck;
}
bool findstart(vector<vector<int>>maps, vector<vector<int>>anw, int n, int m, int) {
bool bCheck = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maps[i][j] != anw[i][j]) {
bCheck = true;
i = n + 1;
j = m + 1;
continue;
}
}
}
return bCheck;
}
struct Data {
int index;
int cnt;
};
struct GDatas {
int change;
int index;
string times;
};
long long n, m;
int k, x;
vector<vector<int>>glistmaps;
vector<bool>bVisited;
void dfs(int x,int cnt) {
if (cnt == k) {
cout << "find:"<< cnt;
}
bVisited[x - 1] = true;
for (int i = 0; i < glistmaps[x].size(); i++) {
if (bVisited[ glistmaps[x][i]-1 ]==false) {
// 2,3
cout << glistmaps[x][i]<<",";
dfs(glistmaps[x][i], cnt+1);
}
}
}
int main() {
cin >> n >> m >> k >> x;
if (k == 0) {
cout << 0;
return 0;
}
vector<vector<int>>listmaps(n+1);
vector<bool>tmpbVisited(n, false);
bVisited = tmpbVisited;
for (int i = 0; i < m; i++) {
int s;
int e;
cin >> s >> e;
listmaps[s].push_back(e);
}
glistmaps = listmaps;
//cout << x << ",";
//dfs(x,0);
queue<Data>q;
Data d;
d.cnt = 1;
d.index = x;
q.push(d);
int cnt = 0;
//cnt++;
bool bEnd = false;
vector<int>gCount;
while (!q.empty()) {
Data start = q.front();
q.pop();
//if (bEnd == true) {
//break;
//}
//cnt++;
//cout << endl;
bVisited[start.index - 1] = true;
for (int i = 0; i < glistmaps[start.index].size(); i++) {
if (bVisited[ glistmaps[start.index][i] - 1 ] == false) {
//cout << start.cnt;//0 0
if (start.cnt == k) {
//cout << glistmaps[start.index][i]<<endl;
bEnd = true;
gCount.push_back(glistmaps[start.index][i]);
}
bVisited[ glistmaps[start.index][i] - 1 ] = true;
Data tmpD;
tmpD.index = glistmaps[ start.index ][i];
tmpD.cnt =start.cnt+1 ;
q.push(tmpD);
//cout << glistmaps[start][i] << ",";
}
}
//cnt++;
}
if (bEnd == false) {
cout << -1;
}
else {
sort(gCount.begin(), gCount.end());
for (int i = 0; i < gCount.size(); i++) {
cout << gCount[i] << endl;
}
}
return 0;
}