• 逃生(反向建图+跑字典序最大的拓扑排序+逆序输出)


    糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。 

    现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。 
    同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。 

    负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。 

    那么你就要安排大家的顺序。我们保证一定有解。

    Input

    第一行一个整数T(1 <= T <= 5),表示测试数据的个数。 
    然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。 

    然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。

    Output

    对每个测试数据,输出一行排队的顺序,用空格隔开。

    Sample Input

    1
    5 10
    3 5
    1 4
    2 5
    1 2
    3 4
    1 4
    2 3
    1 5
    3 5
    1 2

    Sample Output

    1 2 3 4 5

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    
    const int maxn=1e5+5;
    typedef long long ll;
    using namespace std;
    vector<int>edge[maxn];
    int in[30005];
    int n,m;
    void init()
    {
    	for(int t=1;t<=n;t++)
    	edge[t].clear();
    	memset(in,0,sizeof(in));
    }
    void TPsort()
    {
    	priority_queue<int>q;
    	for(int t=1;t<=n;t++)
    	{
    		if(in[t]==0)
    		{
    			q.push(t);
    		}
    	}
    	vector<int>ans;
    	while(!q.empty())
    	{
    		int k=q.top();
    		q.pop();
    		ans.push_back(k);
    		for(int t=0;t<edge[k].size();t++)
    		{
    			int s=edge[k][t];
    			in[s]--;
    			if(in[s]==0)
    			{
    				q.push(s);
    			}
    		}
    	}
        for(int t=ans.size()-1;t>=0;t--)
        {
        	if(t!=0)
        	printf("%d ",ans[t]);
        	else
        	{
        		printf("%d
    ",ans[t]);
    		}
        	
    	}
    }
    int main()
    {
    	int T;
    	cin>>T;
        while(T--)
        {
        	scanf("%d%d",&n,&m);
        	int a,b;
        	init();
        	for(int t=0;t<m;t++)
        	{
        	scanf("%d%d",&a,&b);
        	edge[b].push_back(a);
        	in[a]++;	
            }
            TPsort();
    	}
    	return 0;
    }
  • 相关阅读:
    Comparable内部比较器 和 Comparator外部比较器
    java——包装类数据缓存 ==号详解
    java——包装类中的equals方法
    Eclipse怎么改变@author 姓名
    非常简约学生管理系统——HashSet进行编写
    TreeMap——实现comparable接口并重写CompareTo方法
    flume收集日志直接sink到oracle数据库
    大文件多个服务器复制拷贝
    oracle创建用户表空间
    缓存策略:redis缓存之springCache
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781775.html
Copyright © 2020-2023  润新知