알고리즘 공부

백준 특정거리의 도시 찾기

컴퓨터과학 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;
}