zoukankan      html  css  js  c++  java
  • HDOJ4857【拓扑排序】

    首先 CLJ ORZ
    这道题做了两次,第一次瞎搞。。。
    第二次,好吧,骄傲地说水过。。。
    题意:不说了;
    思路:
    题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来;

    第一次做的时候,我记得我的思路是:还是正向建图,然后每次拿小的出来,天真啊,年轻啊,一个例子:1->3->4和5->2,很明显最终的排序,应该是1,5,2,3,4,其实一开始我还看过题解不理解为什么会这样,我还是理解成1,3,4,6,2,但是你得明白小的在前面,你看例子,{1,3,4}和{6,2}是两个独立的集合,2和3,4没有关系,所以3,4在2后面,那么首先就是要6在前面。所以有上面的方法;

    code:

    #include<stdio.h>
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<climits>
    #include<algorithm>
    using namespace std;
    #define ll unsinged long long
    #define PI acos(-1.0)
    #define ING 0x7fffffff
    #define INF 0x3f3f3f3f
    #define mod 1000000007
    #define N  301000
    struct asd{
        int to;
        int next;
    };
    asd q[N];
    int head[N],tol;
    int vis[N];
    int d[N];
    int pre[N];
    int n,m;
    int ans[N];
    int num;
    
    void add(int a,int b)
    {
        q[tol].to=b;
        q[tol].next=head[a];
        head[a]=tol++;  
    }
    
    void tuopu()
    {
        priority_queue<int>que;  //默认优先级是从大到小;
        while(!que.empty())
            que.pop();
        for(int i=1;i<=n;i++)
        {
            if(!d[i])
                que.push(i);
        }
        num=0;
        while(!que.empty())
        {
            int u=que.top();
            que.pop();
            ans[num++]=u;
            for(int k=head[u];k!=-1;k=q[k].next)
            {
                int i=q[k].to;
                d[i]--;
                if(!d[i])
                    que.push(i);
            }
        }
        for(int i=num-1;i>0;i--)
        {
            printf("%d ",ans[i]);
        }
        printf("%d
    ",ans[0]);
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            tol=0;
            memset(head,-1,sizeof(head));
            memset(d,0,sizeof(d));
            for(int i=0;i<m;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                d[a]++;
                add(b,a);
            }
            tuopu();
        }
        return 0;
    }
  • 相关阅读:
    .Net常识之 浅析as和is操作符
    使用com object 控制outlook
    override 和 new 关键字的总结
    interface Virtual and abstract
    SQL Server 索引结构及其使用(四)
    ASP。NET的设计思想
    系统性能的提升之二"聚集索引"的建立
    SQL Server 索引结构及其使用(一)
    form 中加上target
    创建多维ArrayList的方法
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934526.html
Copyright © 2011-2022 走看看