• hdu-----(4857)逃生(拓扑排序)


    逃生

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1161    Accepted Submission(s): 368


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

    现在有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
     
    Author
    CLJ
     
    Source
     
    这道题,因为关于名次问题,属于拓扑排序的范畴,但是数据规模很大,不利于建图来求索,于是运用邻接表(或者用vector来模拟),由于以小优先,所以我们不妨采用拓扑图第二种方法,即反向推到,但是若采取普通的拓扑图会TLE,这里有需要去进一步优化,即采用优先队列来存取出度为0的的点...
    代码:356ms
    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<vector>
    #include<queue>
    using namespace std;
    const int maxn=30005;
    vector<vector<int> >mat;
    stack<int >ans;
    int outdg[maxn];
    struct cmp{
      bool operator ()( int &a,int &b){
        return a<b;
      }
    };
    priority_queue<int,vector<int>,cmp>aa;
    int n,m;
    void tp_sort(){
        int len,i;
        while(!aa.empty()){
             i=aa.top();
               aa.pop();
             ans.push(i);
             len=mat[i].size();
          for(int j=0;j<len;j++){
              outdg[mat[i][j]]--;
              if(outdg[mat[i][j]]==0)aa.push(mat[i][j]);
          }
        }
    }
    int main(){
      //  sync_with_stdio(1);
      int cas,i,a,b;
      scanf("%d",&cas);
      while(cas--)
      {
        scanf("%d%d",&n,&m);
        mat.clear();
        mat.resize(n+2);
        memset(outdg,0,sizeof(int)*(n+1));
        for(i=0;i<m;i++){
          scanf("%d%d",&a,&b);
           mat[b].push_back(a);
           outdg[a]++;
        }
        for(i=n;i>=1;i--)
           if(outdg[i]==0)aa.push(i);
        tp_sort();
        printf("%d",ans.top());
        ans.pop();
        while(!ans.empty()){
            printf(" %d",ans.top());
            ans.pop();
        }
        puts("");
      }
    return 0;
    }
  • 相关阅读:
    HTML DOM教程 9HTML DOM Window 对象
    HTML DOM教程 11HTML DOM Screen 对象
    Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
    Qt把ping www.baidu.com之后的内容的内容输出到一个名为output的文档
    Qt之QProcess 和 c语言对比
    Git的Windows版本Msysgit的中文乱码解决
    多系统 grub之ubuntu的 grub
    QT中调用外部程序:QProcess的使用
    repo的小结
    恢复Ubuntu默认的面板
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3965835.html
Copyright © 2020-2023  润新知