zoukankan      html  css  js  c++  java
  • (拓扑)确定比赛名次 -- hdu -- 1285

    http://acm.hdu.edu.cn/showproblem.php?pid=1285

    确定比赛名次

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 18484    Accepted Submission(s): 7399


    Problem Description
    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
     
    Input
    输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
     
    Output
    给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
     
    Sample Input
    4 3
    1 2
    2 3
    4 3
     
    Sample Output
    1 2 4 3
     

     

    学了一点后自己写的

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    
    #define N 1100
    
    #define met(a,b) (memset(a,b,sizeof(a)))
    typedef long long LL;
    
    struct nnode
    {
        int u, v;
    }a[N];
    
    struct node
    {
        int num;
        bool friend operator < (node n1, node n2)
        {
            return n1.num > n2.num;
        }
    };
    
    vector<int>G[N];
    int r[N], b[N], k, n;
    
    ///r[i] 第i个点的入度
    
    void Slove()
    {
        int i;
        node p, q;
    
        priority_queue<node>Q;
    
        for(i=1; i<=n; i++)
        {
            if(r[i]==0)
            {
                 p.num = i;
                 Q.push(p);
            }
        }
    
        while(Q.size())
        {
            p = Q.top(), Q.pop();
            b[k++] = p.num;
    
            int len = G[p.num].size();
            for(i=0; i<len; i++)
            {
                int v = G[p.num][i];
                r[v]--;
                if(!r[v])
                {
                    q.num = v;
                    Q.push(q);
                }
            }
        }
    }
    
    
    int main()
    {
        int m;
    
        while(scanf("%d%d", &n, &m)!=EOF)
        {
            int i;
    
            met(a, 0);
            met(r, 0);
            met(b, 0);
            for(i=0; i<=n; i++)
                G[i].clear();
    
            for(i=1; i<=m; i++)
            {
                scanf("%d%d", &a[i].u, &a[i].v);
                r[a[i].v]++;
                G[a[i].u].push_back(a[i].v);
            }
    
            k=0;
            Slove();
    
            for(i=0; i<k; i++)
                printf("%d%c", b[i], i==k-1?'
    ':' ');
    
        }
        return 0;
    }
    
    /**
    
    4 3
    1 2
    2 3
    4 3
    4 3
    4 3
    3 2
    2 1
    
    */

     之前看别人的代码

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    
    using namespace std;
    
    #define N 550
    
    int v[N][N], s[N];
    
    void Put(int n)
    {
        int i, j, k;
    
        for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        {
                if(s[j]==0)
                {
                    s[j]--;
                    if(i==n) printf("%d
    ", j);
                    else printf("%d ", j);
    
                    for(k=1; k<=n; k++)
                    {
                        if(v[j][k])
                        {
                            s[k]--;
                        }
                    }
                    break;
                }
        }
    }
    
    int main()
    {
        int n, m;
    
        while(scanf("%d%d", &n, &m)!=EOF)
        {
            int i, a, b;
    
            memset(v, 0, sizeof(v));
            memset(s, 0, sizeof(s));
            for(i=1; i<=m; i++)
            {
                scanf("%d%d", &a, &b);
                if(!v[a][b])
                {
                    v[a][b] = 1;
                    s[b]++;
                }
            }
    
            Put(n);
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    洛谷P5661 公交换乘(二分)
    洛谷P4047 [JSOI2010]部落划分(最小生成树)
    洛谷P2872 [USACO07DEC]Building Roads S(最小生成树)
    卸载重装VirtualBox回滚报错
    POJ1151 Atlantis(扫描线+线段树+离散化)
    QT入门-信号槽拓展
    Vue模板语法与常用指令总结
    Vue 生命周期
    querySelector和getElementById方法的区别
    ES6 Class(类)的继承与常用方法
  • 原文地址:https://www.cnblogs.com/YY56/p/5022255.html
Copyright © 2011-2022 走看看