HDU1285는 경쟁의 순위를 결정합니다(토폴로지 정렬 + 우선 순위 대기열).

주제 링크

http://acm.hdu.edu.cn/showproblem.php?pid=1285

아이디어

각 게임의 결과는 이긴 쪽에서 지는 쪽으로 방향성 그래프로 볼 수 있는데, 이 방향성 그래프의 in-degree가 0인 지점이 순위를 결정할 수 없는 가장 바깥쪽 지점이고 다음을 따른다. 작은 숫자부터 작은 숫자까지 큰 정렬을 하려면 이 포인트를 ans에 저장하고 이 포인트의 모든 아웃도를 지운 다음 다음 레이어를 봅니다. 이것은 실제로 토폴로지 정렬이지만 다음을 확인해야 합니다. 순위는 고유하지 않습니다. 숫자가 작은 팀은 우선 순위 대기열 을 사용하여 이 토폴로지 순서를 유지할 수 있습니다. 자세한 내용은 코드를 참조하십시오.

암호

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

const int N = 5e2+10;

int n,m;
int du[N];

vector<int> E[N];

void topsort(){
    
    
	vector<int> ans;
	priority_queue<int,vector<int>,greater<int> > que;
	for(int i = 1;i <= n; ++i) 
		if(!du[i]) que.push(i);
	
	while(!que.empty()){
    
    
		int t = que.top();
		que.pop();
		ans.push_back(t);
		for(int i = 0,l = E[t].size();i < l; ++i) {
    
    
			int v = E[t][i];
			du[v]--;
			if(!du[v]) que.push(v);
		}
	}
	for(int i = 0;i < n; ++i)
		cout<<ans[i]<<" \n"[i == n-1];
}


int main()
{
    
    
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	while(cin>>n>>m){
    
    
		for(int i = 0;i <= n; ++i) 
			E[i].clear(),du[i] = 0;
		int u,v;
		for(int i = 1;i <= m; ++i) {
    
    
			cin>>u>>v;
			du[v]++;
			E[u].push_back(v);
		}
		topsort();
	}
	return 0;
}

추천

출처blog.csdn.net/m0_46201544/article/details/123826423