zoukankan      html  css  js  c++  java
  • BestCoder Round #1

    逃生

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


    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
     
    逆序拓补排序。
    反向建图。用优先队列将大的放在前面。然后逆序输出。
    //453MS	2288K
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<queue>
    #define M 30007
    using namespace std;
    vector<int> v[M];
    int in[M],ans[M],num,n;
    void topsort()
    {
        num=0;
        priority_queue<int>q;
        for(int i=1;i<=n;i++)
            if(!in[i]){q.push(i);}
            while(!q.empty())
            {
                int u=q.top();
                q.pop();
                for(int i=0;i<v[u].size();i++)
                {
                    in[v[u][i]]--;
                    if(!in[v[u][i]])q.push(v[u][i]);
                }
                ans[num++]=u;
            }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int m;
            scanf("%d%d",&n,&m);
            memset(in,0,sizeof(in));
            for(int i=1;i<=n;i++)
                v[i].clear();
            int a,b;
            while(m--)
            {
                scanf("%d%d",&a,&b);
                v[b].push_back(a);
                in[a]++;
            }
            topsort();
            for(int i=num-1;i>0;i--)
                printf("%d ",ans[i]);
            printf("%d
    ",ans[0]);
        }
        return 0;
    }


    项目管理

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


    Problem Description
    我们建造了一个大项目!这个项目有n个节点,用非常多边连接起来。而且这个项目是连通的!


    两个节点间可能有多条边。只是一条边的两端必定是不同的节点。


    每一个节点都有一个能量值。

    如今我们要编写一个项目管理软件,这个软件呢有两个操作:
    1.给某个项目的能量值加上一个特定值。
    2.询问跟一个项目相邻的项目的能量值之和。(假设有多条边就算多次,比方a和b有2条边。那么询问a的时候b的权值算2次)。

     

    Input
    第一行一个整数T(1 <= T <= 3),表示測试数据的个数。


    然后对于每一个測试数据。第一行有两个整数n(1 <= n <= 100000)和m(1 <= m <= n + 10),分别表示点数和边数。



    然后m行,每行两个数a和b,表示a和b之间有一条边。


    然后一个整数Q。

    然后Q行,每行第一个数cmd表示操作类型。假设cmd为0,那么接下来两个数u v表示给项目u的能量值加上v(0 <= v <= 100)。
    假设cmd为1,那么接下来一个数u表示询问u相邻的项目的能量值之和。

    全部点从1到n标号。

     

    Output
    对每一个询问,输出一行表示答案。

     

    Sample Input
    1 3 2 1 2 1 3 6 0 1 15 0 3 4 1 1 1 3 0 2 33 1 2
     

    Sample Output
    4 15 15
     

    Author
    CLJ
     

    直接模拟就能够。
    假设用邻接表来存会超时。用vector就过了。
    //453MS	2288K
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<queue>
    #define M 30007
    using namespace std;
    vector<int> v[M];
    int in[M],ans[M],num,n;
    void topsort()
    {
        num=0;
        priority_queue<int>q;
        for(int i=1;i<=n;i++)
            if(!in[i]){q.push(i);}
            while(!q.empty())
            {
                int u=q.top();
                q.pop();
                for(int i=0;i<v[u].size();i++)
                {
                    in[v[u][i]]--;
                    if(!in[v[u][i]])q.push(v[u][i]);
                }
                ans[num++]=u;
            }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int m;
            scanf("%d%d",&n,&m);
            memset(in,0,sizeof(in));
            for(int i=1;i<=n;i++)
                v[i].clear();
            int a,b;
            while(m--)
            {
                scanf("%d%d",&a,&b);
                v[b].push_back(a);
                in[a]++;
            }
            topsort();
            for(int i=num-1;i>0;i--)
                printf("%d ",ans[i]);
            printf("%d
    ",ans[0]);
        }
        return 0;
    }


  • 相关阅读:
    PAT 甲级 1115 Counting Nodes in a BST (30 分)
    PAT 甲级 1114 Family Property (25 分)
    PAT 甲级 1114 Family Property (25 分)
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7045175.html
Copyright © 2011-2022 走看看