SOL)
BFS
indgree[i]: 정점 i로 연결 된 정점의 개수(방향성 x->i)
adj: 인접리스트
reAdj: adj의 방향성을 모두 반대로 저장한 인접리스트
임이의 정점 x의 Strahler값을 판단 하려면 정점 x를 연결하는 정점들의 Strahler값을 모두 보아야 한다.
즉, 아래의 소스에서 가장 중요한 부분은 if(--indegree[next] > 0) continue;인데
next를 연결하는 어떤 정점의 Strahler값이 정해지지 않았다면
indegree[next]의 값은 1감소 시키고 continue를 해야한다.
[-] Collapse
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
vector<vector<int> > adj, reAdj;
queue<int> q;
int indgree[1001], outdgree[1001], Strahle[1001];
int END;
int search(){
while (!q.empty()){
int size = q.size();
for (int i = 0; i < size; i++){
int here = q.front();
q.pop();
for (int j = 0; j < adj[here].size(); j++){
int next = adj[here][j];
if (--indgree[next] > 0) continue;
q.push(next);
int val = 0;
for (int k = 0; k < reAdj[next].size(); k++)
val = max(val, Strahle[reAdj[next][k]]);
int i = 2;
for (int k = 0; k < reAdj[next].size(); k++){
if (val == Strahle[reAdj[next][k]]) i--;
}
if (i == 0) val++;
Strahle[next] = val;
}
}
}
return Strahle[END];
}
int main(){
int t; scanf("%d", &t);
while (t--){
memset(indgree, 0, sizeof(indgree));
memset(outdgree, 0, sizeof(outdgree));
memset(Strahle, 0, sizeof(Strahle));
int tN, N, C; scanf("%d%d%d", &tN, &N, &C);
reAdj = adj = vector<vector<int> >(N+1);
for (int i = 0; i < C; i++){
int u, v; scanf("%d%d", &u, &v);
adj[u].push_back(v);
reAdj[v].push_back(u);
outdgree[u]++;
indgree[v]++;
}
for (int i = 1; i <= N; i++) {
if (indgree[i] == 0) q.push(i), Strahle[i] = 1;
if (outdgree[i] == 0) END = i;
}
printf("%d %d\n", tN, search());
}
}
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
vector<vector<int> > adj, reAdj;
queue<int> q;
int indgree[1001], outdgree[1001], Strahle[1001];
int END;
int search(){
while (!q.empty()){
int size = q.size();
for (int i = 0; i < size; i++){
int here = q.front();
q.pop();
for (int j = 0; j < adj[here].size(); j++){
int next = adj[here][j];
if (--indgree[next] > 0) continue;
q.push(next);
int val = 0;
for (int k = 0; k < reAdj[next].size(); k++)
val = max(val, Strahle[reAdj[next][k]]);
int i = 2;
for (int k = 0; k < reAdj[next].size(); k++){
if (val == Strahle[reAdj[next][k]]) i--;
}
if (i == 0) val++;
Strahle[next] = val;
}
}
}
return Strahle[END];
}
int main(){
int t; scanf("%d", &t);
while (t--){
memset(indgree, 0, sizeof(indgree));
memset(outdgree, 0, sizeof(outdgree));
memset(Strahle, 0, sizeof(Strahle));
int tN, N, C; scanf("%d%d%d", &tN, &N, &C);
reAdj = adj = vector<vector<int> >(N+1);
for (int i = 0; i < C; i++){
int u, v; scanf("%d%d", &u, &v);
adj[u].push_back(v);
reAdj[v].push_back(u);
outdgree[u]++;
indgree[v]++;
}
for (int i = 1; i <= N; i++) {
if (indgree[i] == 0) q.push(i), Strahle[i] = 1;
if (outdgree[i] == 0) END = i;
}
printf("%d %d\n", tN, search());
}
}
댓글 없음:
댓글 쓰기