문제
철민이는 종강을 기념하여 � 개의 나라로 즉흥 여행을 떠나기로 했다.
철민이의 조사에 따르면, � 개의 나라 사이에는 총 � 개의 항공편이 있으며, 각각의 항공편은 출발하는 나라와 도착하는 나라가 정해져있다.
철민이는 즉흥 여행인 만큼 여행 계획을 짜는 대신, 아래 방식으로 여행하겠다는 계획만 세웠다.
- 우선 여행을 시작할 나라를 정한 뒤, 그 나라로 간다.
- 그 뒤로, 현재 있는 나라에서 출발하는 항공편 중 원하는 걸 골라서 탄다.
- 철민이는 하나의 나라를 여러 번 방문할 수 있으며, 하나의 항공편을 여러 번 사용할 수 있다.
위 계획을 본 당신은 철민이가 � 개의 나라를 모두 여행할 수 있을지 걱정이 되기 시작했고, 철민이가 선택하는 시작점과 관계없이 모든 나라를 여행할 수 있을지 미리 확인해보기로 했다.
입력
첫째 줄에 나라의 개수 � 과 항공편의 개수 � 이 주어진다. (1≤�≤200000; 0≤�≤500000)
둘째 줄부터 � 개의 줄에 걸쳐 항공편의 정보가 두 정수 � � 로 주어진다. 이는 � 번 나라에서 출발해 � 번 나라로 가는 항공편을 의미한다. (1≤�,�≤�; �≠�)
출력
시작점을 어떻게 골라도 모든 나라를 방문할 수 있는 경로가 있다면 Yes를, 아니면 No를 출력한다.
어느 나라에서 출발을 하든 모든 나라에 도착할 수 있어야 합니다.
강결합컴포넌트 scc가 단 하나만 있어야 합니다.
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int dy[] = { -1,0,1,0 }, dx[] = { 0,1,0,-1 }, INF = 987654321;
int N, M, v[200001], s[200001], cnt, num;
vvi scc;
vi adj[200001], st;
int dfs(int k) {
st.push_back(k);
int parent = v[k] = ++cnt;
for (int r : adj[k]) {
if (!v[r]) {
parent = min(parent, dfs(r));
}
else if (!s[r]) {
parent = min(parent, v[r]);
}
}
if (v[k] == parent) {
vi temp; num++;
while (1) {
int top = st.back();
st.pop_back();
temp.push_back(top);
s[top] = num;
if (top == k)break;
}
scc.push_back(temp);
}
return parent;
}
int main() {
FAST;
cin >> N >> M;
while (M--) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
}
REP(i, N) {
if (!v[i])dfs(i);
}
num==1?cout << "Yes":cout << "No";
}
'baekjoon' 카테고리의 다른 글
[백준] 1017 소수 쌍 (0) | 2023.07.10 |
---|---|
[백준] 17070 파이프 옮기기 1 (0) | 2023.07.10 |
[백준] 1495 기타리스트 (0) | 2023.07.05 |
[백준] 2225 합분해 (0) | 2023.07.05 |
[백준] K번째 수 (복습 필요,,) (0) | 2023.07.05 |