zoukankan      html  css  js  c++  java
  • HDU-4857-逃生-反向拓扑排序+优先队列

    HDU-4857

    题意就是做一个符合条件的排序,用到拓扑序列。

    我一开始wa了多发,才发现有几个样例过不了,发现1->2->3...的顺序无法保证。

    后来就想用并查集强连,还是wa;

    后来发现发用反向拓扑排序+优先队列才可以通过;

    这里注意把入度为0的入队改成了出度为0的入队

    下面是AC代码:

    #include <cstring>
    #include<queue>
    #include <cstdio>
    using namespace std;
    vector<int>to[30000+10];
    int n,m,cnt;
    int outdeed[30000+10],topo [30000+10];
    void init(){
        memset(outdeed,0,sizeof(outdeed));
        for(int i=1;i<=n;i++)
            to[i].clear();
        memset(topo,0,sizeof(topo));
    }
    void toposort()
    {
        priority_queue<int>q;
        for(int i=1;i<=n;i++)
            if(!outdeed[i])q.push(i);
        cnt=0;
        while(!q.empty())
        {
            int tmp = q.top();
            q.pop();
            topo[++cnt]=tmp;
            int k = to[tmp].size();
            for(int i=0;i<k;i++)
            {
                int tt = to[tmp][i];
                outdeed[tt]--;
                if(outdeed[tt]==0)q.push(tt);
            }
        }
    }
    void output()
    {
        for(int i=n;i>=1;i--)
            printf("%d%c",topo[i],i==1?'
    ':' ');
    }
    int main(){
        int T;
        scanf("%d",&T);
        while(T--)
        {
    
            scanf("%d%d",&n,&m);
            init();
            for(int i=1;i<=m;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                to[v].push_back(u);
                outdeed[u]++;
            }
            toposort();
            output();
        }
    
        return 0;
    }
    skr
  • 相关阅读:
    Ubuntu在用root账户使用xftp连接时提示拒绝连接
    Ubuntu设置root账户密码
    Ubuntu安装Nginx
    Ubuntu不能上网解决办法
    Ubuntu16.04修改静态ip地址
    Ubuntu下vi编辑器不听话
    thinkpad t420安装debian需要注意的细节
    debian7配置iptables
    debian的甘特图工具
    debian修改ssh端口
  • 原文地址:https://www.cnblogs.com/ckxkexing/p/8419277.html
Copyright © 2011-2022 走看看