【拓扑排序】确定比赛名次

题目描述

代码实现

//拓扑排序模板题,注意使用优先队列 
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 510;

vector<int> output;
vector<int> adj[maxn];
int n;
int m;
int inDegree[maxn];

void topoSort(){
	priority_queue<int,vector<int>,greater<int>> q;
	for(int i=1;i<=n;i++){
		if(inDegree[i]==0){
			q.push(i);
		}
	}
	
	while(!q.empty()){
		int cur = q.top();
		q.pop();
		
		output.push_back(cur);
		
		for(int i=0;i<adj[cur].size();i++){
			int v = adj[cur][i];
			inDegree[v]--;
			if(inDegree[v]==0){
				q.push(v);
			} 
		}
	}
	
	for(int i=0;i<=output.size()-1;i++){
		printf("%d",output[i]);
		if(i!=output.size()-1){
			printf(" ");
		}else{
			printf("\n");
		}
	}
	
	return;
}

int main(){
	freopen("in.txt","r",stdin);
	while(scanf("%d",&n)!=EOF){
		scanf("%d",&m);
		fill(inDegree,inDegree+maxn,0);
		output.clear();
		for(int i=0;i<maxn;i++){
			adj[i].clear();
		}
		int u,v;
		for(int i=0;i<m;i++){
			scanf("%d %d",&u,&v);
			adj[u].push_back(v);
			inDegree[v]++;
		}
		//开始拓扑排序
		topoSort(); 
	}
	return 0;
}

码后反思

  1. 这道题目非常不符合人类思维,正常人的比赛不都是积分制的吗???

  2. 对于输入数据:

    8 5
    1 2
    2 3
    4 3
    7 6
    8 6
    

    输出居然是

    1 2 4 3 5 7 8 6
    

    对不起,告辞~~
    我觉得应该是我这样写的:

    //拓扑排序模板题,注意使用优先队列 
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <algorithm>
    using namespace std;
    const int maxn = 510;
    
    struct person{
    	int id;
    	int layer;
    	friend bool operator < (person a,person b){
    		return a.layer!=b.layer ? a.layer>b.layer : a.id < b.id;
    	}
    }; 
    
    vector<int> output;
    vector<int> adj[maxn];
    int n;
    int m;
    int inDegree[maxn];
    
    void topoSort(){
    	priority_queue<person> q;
    	for(int i=1;i<=n;i++){
    		if(inDegree[i]==0){
    			person tmp;
    			tmp.id = i;
    			tmp.layer = 1;
    			q.push(tmp);
    		}
    	}
    	
    	while(!q.empty()){
    		person cur = q.top();
    		int id = cur.id;
    		int layer = cur.layer;
    		q.pop();
    		
    		output.push_back(id);
    		
    		for(int i=0;i<adj[id].size();i++){
    			int v = adj[id][i];
    			inDegree[v]--;
    			if(inDegree[v]==0){
    				person tmp;
    				tmp.id = v;
    				tmp.layer = layer+1;
    				q.push(tmp);
    			} 
    		}
    	}
    	
    	for(int i=output.size()-1;i>=0;i--){
    		printf("%d",output[i]);
    		if(i!=0){
    			printf(" ");
    		}else{
    			printf("\n");
    		}
    	}
    	
    	return;
    }
    
    int main(){
    	//freopen("in.txt","r",stdin);
    	while(scanf("%d",&n)!=EOF){
    		scanf("%d",&m);
    		fill(inDegree,inDegree+maxn,0);
    		output.clear();
    		for(int i=0;i<maxn;i++){
    			adj[i].clear();
    		}
    		int u,v;
    		for(int i=0;i<m;i++){
    			scanf("%d %d",&u,&v);
    			adj[v].push_back(u);
    			inDegree[u]++;
    		}
    		//开始拓扑排序
    		topoSort(); 
    	}
    	return 0;
    }
    
    
  3. 这道题让我回顾了priority_queue里面的priority_queue<int,vector<int>,greater<int>>这种写法,注这里面的写法,我总是忘记。。。一个vector,一个greater,都是<int>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值