# 拓扑排序 hdu4857逃生

题目链接
题意
n个人要出逃,m个约束条件,a b表示a这个人必须在b这个人之前出去,同时序号小的人尽量前面出去。求符合要求的一个顺序。
思路
拓扑排序:将有向无环图G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。这里写一个拓扑排序还不够,因为题目还要求序号小的人排在前面,单纯用一个优先队列是得不到正确答案的,因此采用建反图的思路然后把答案逆序输出。
代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
vector<int>tu[30010],ans;
priority_queue<int>q;
int in[30010];//各点的入度
int T,n,m;
int main()
{
    int a,c,i,j,tp;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        memset(in,0,sizeof(in));//初始化
    	ans.clear();
    	for(i=0;i<=n;i++){
    		tu[i].clear();
		}
		while(!q.empty()) q.pop();
        while(m--)
        {
            scanf("%d%d",&a,&c);
            tu[c].push_back(a);
            in[a]++;
        }
        int i,j;
	    for(i=1;i<=n;i++)
	        if(in[i]==0) q.push(i);
	    while(!q.empty()){
            tp=q.top();
            q.pop();
            ans.push_back(tp);
            //printf("ans[%d]=%d\n",count-1,ans[count-1]);
            for(i=0;i<tu[tp].size();i++){
                in[tu[tp][i]]--;
                if(in[tu[tp][i]]==0){
                    q.push(tu[tp][i]);
                }
            }
        }
	    for(i=ans.size()-1;i>0;i--){
            printf("%d ",ans[i]);
        }
        printf("%d\n",ans[0]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值