2017 Dizzy Cows (클래식 토폴로지 정렬)

이 문 제 는 비교적 전형 적 인 토폴로지 템 플 릿 문제 로 토폴로지 순 서 를 표시 하 는 배열 top 만 추가 하면 된다.
단 방향 변 을 넣 은 후 토폴로지 정렬 을 하고 토폴로지 정렬 에서 top 배열 기록 을 합 니 다.
다시 양 방향 변 을 넣 을 때 토폴로지 정렬 의 성질 (top 값 은 토폴로지 정렬 의 위 치 를 나타 낸다) 에 따라 임의의 두 점 을 추가 합 니 다. 추 가 된 변 은 top 값 이 작은 점 이 top 값 이 큰 점 을 가리 키 면 만족 할 수 있 습 니 다 (같 아 도 됩 니 다. 제 가 실현 한 코드 에서 같은 것 은 0 값, 즉 입 도 는 0 노드 입 니 다).
입문 소 백 하나, 잘 부탁드립니다.
#include
#include
#include
#include
#include
#define int long long
using namespace std;
const int NN = 1e5 + 17, M = 1e5 + 17;//NN    ,M   
int n, cnt, deg[NN], lin[NN];//n    ,deg   

//TODO(         )
//FROM
int top[NN];
//END

struct node {
	int to, next;
}e[M];

void add(int f, int t) {
	deg[t]++;
	cnt++;
	e[cnt].to = t;
	e[cnt].next = lin[f];
	lin[f] = cnt;
}

void init() {
	cnt = 0;
	for (int i = 0; i <= n; i++)
		deg[i] = lin[i] = 0;

	//TODO(              )
	//BEGIN
	for (int i = 0; i <= n; i++)
		top[i] = 0;
	//END
}

void bfs() {
	queue Q;
	for (int i = 1; i <= n; i++)
		if (deg[i] == 0) {
			Q.push(i);
			//TODO
			//FROM
			top[i] = cnt++;
			//END
		}
	while (!Q.empty()) {
		int now = Q.front();
		Q.pop();
		for (int i = lin[now]; i > 0; i = e[i].next) {
			deg[e[i].to]--;
			//TODO(        )
			//FROM

			//END
			if (deg[e[i].to] == 0) {
				Q.push(e[i].to);
				//TODO(        )
				//FROM
				top[e[i].to] = cnt++;
				//END
			}
		}
	}
}

signed main() {
	int p1, p2;
	cin >> n >> p1 >> p2;
	for (int i = 1; i <= p1; i++) {
		int x, y;
		cin >> x >> y;
		add(x, y);
	}
	bfs();
	for (int i = 1; i <= p2; i++) {
		int x, y;
		cin >> x >> y;
		if (top[x] > top[y])
			cout << y << ' ' << x << endl;
		else
			cout << x << ' ' << y << endl;
	}
	return 0;
}

좋은 웹페이지 즐겨찾기