https://www.acmicpc.net/problem/9470
간단해보여서 bfs로 풀어볼라했는데 복잡해지길래 위상정렬을 쓰면 훨씬 쉬울것 같아서 위상정렬을 사용했습니다. 현재 노드의 Strahler순서를 기록하는것에 유의하면서 풀면 됩니다. 저는 pair배열을 사용했습니다.
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<bitset>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
cin.tie(0)->sync_with_stdio(0);
}
long long mod=1000000007;
int main(){
fast_io();
int T;
cin>>T;
while(T--){
int K,M,P;
cin>>K>>M>>P;
vector<vector<int>> Edge(M+1,vector<int>());
vector<int> indegree(M+1,0);
vector<pair<int,int>> visit(M+1,{0,0});
for(int x=0;x<P;x++){
int src,dst;
cin>>src>>dst;
indegree[dst]++;
Edge[src].push_back(dst);
}
queue<int> Q;
for(int x=1;x<=M;x++){
if(indegree[x]==0){
Q.push(x);
visit[x]={1,1};
}
}
while(!Q.empty()){
int now=Q.front();
Q.pop();
int k=visit[now].second>1 ? visit[now].first+1 : visit[now].first;
for(auto i : Edge[now]){
indegree[i]--;
if(visit[i].first<k){
visit[i].first=k;
visit[i].second=1;
}
else if(visit[i].first==k){
visit[i].second++;
}
if(indegree[i]==0){
Q.push(i);
}
}
}
visit[M].first= visit[M].second>1 ? visit[M].first+1 : visit[M].first;
cout<<K<<" "<<visit[M].first<<'\n';
}
}
'PS > boj' 카테고리의 다른 글
백준 23325 마법천자문 (C++) (0) | 2022.07.10 |
---|---|
백준 10838 트리 (C++) (0) | 2022.07.09 |
백준 15910 바나나나빠나나 (C++) (0) | 2022.07.07 |
백준 3114 사과와 바나나 (C++) (0) | 2022.07.06 |
백준 23044 트리 조각하기 (C++) (0) | 2022.07.05 |