• 逃生(逆拓扑排序


    题目链接

    思路:

      如果n=3。   3->1,2(孤立) ,那么正向拓扑,应该是2 3 1,因为1要比2先出来,所以这种不满足。  逆向: 1->3,2 。此时若优先级从大到小,则2 1 3,逆向输入就是3 1 2 。

    #include<iostream>
    #include<cstdio>
    #include <cctype>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    using namespace std;
    #define ll long long
    #define mem(a,x) memset(a,x,sizeof(a))
    #define se second
    #define fi first
    const ll mod=998244353;
    const int INF= 0x3f3f3f3f;
    const int N=2e5+5;
    
    int n,m;
    int in[30005],ans[30005];
    priority_queue<int > q;
    vector<int>v[30005];
    
    void bfs()
    {
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(in[i]==0)
                q.push(i);
        }
        while(!q.empty())
        {
            int t=q.top();
            q.pop();
            ans[++cnt]=t;
            for(int i=0;i<v[t].size();i++)
            {
                in[v[t][i]]--;
                if(in[v[t][i]]==0)
                    q.push(v[t][i]);
            }
        }
        
        for(int i=cnt;i>1;i--)
            printf("%d ",ans[i]);
        printf("%d
    ",ans[1]);
    }
    int main()
    {
        int T; cin>>T;
        int x,y;
        while(T--)
        {
            mem(v,0);
            mem(in,0);
            mem(ans,0);
            while(!q.empty()) q.pop();
            
            scanf("%d%d",&n,&m);
            while(m--)
            {
                scanf("%d%d",&x,&y);
                v[y].push_back(x);
                in[x]++;
                //cout<<in[x];
            }
            bfs();
        }    
    }
  • 相关阅读:
    服务器模型??
    tcp和udp详解??
    osi七层模型??
    高内聚 低耦合??
    进程和线程的区别和联系??
    2019.10.03题解
    2019.10.02题解
    2019.09.29考试报告
    2019.09.27考试报告
    2019.09.26考试报告
  • 原文地址:https://www.cnblogs.com/thunder-110/p/10326309.html
Copyright © 2020-2023  润新知