zoukankan      html  css  js  c++  java
  • hdu 1285 确定比赛名次

      对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

    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 <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <cstdlib>
    #include <iomanip>
    #include <cmath>
    #include <cassert>
    #include <ctime>
    #include <map>
    #include <set>
    using namespace std;
    #pragma comment(linker, "/stck:1024000000,1024000000")
    #define lowbit(x) (x&(-x))
    #define max(x,y) (x>=y?x:y)
    #define min(x,y) (x<=y?x:y)
    #define MAX 100000000000000000
    #define MOD 1000000007
    #define pi acos(-1.0)
    #define ei exp(1)
    #define PI 3.1415926535897932384626433832
    #define ios() ios::sync_with_stdio(true)
    #define INF 0x3f3f3f3f
    #define mem(a) ((a,0,sizeof(a)))
    typedef long long ll;
    vector<int>v[506];
    int x,y,degree[506];
    int vis[506],n,m;
    void toposort()
    {
        priority_queue<int,vector<int>,greater<int> >q;
        for(int i=1;i<=n;i++)
        {
            if(!degree[i])
            {
                q.push(i);
                vis[i]=1;
            }
        }
        bool flag=0;
        while(!q.empty())
        {
            int u=q.top();
            q.pop();
            if(!flag){printf("%d",u);flag^=1;}
            else printf(" %d",u);
            for(int i=0;i<v[u].size();i++)
            {
                degree[v[u][i]]--;
                if(!degree[v[u][i]]) q.push(v[u][i]);
            } 
        }
        printf("
    ");
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=0;i<=n;i++)
                v[i].clear();
            memset(degree,0,sizeof(degree));
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&x,&y);
                v[x].push_back(y);
                degree[y]++;
            }
            toposort();
        }
        return 0;
    }
  • 相关阅读:
    CentOS下安装nginx并且升级nginx到最新版
    简单配置nginx使之支持pathinfo
    php设置和获取cookie
    div不能被点击设置
    设置CentOS里的Mysql开启客户端远程连接
    leetcode
    background-image中url找不到路径,背景图像无法显示
    0x3F3F3F3F——ACM中的无穷大常量
    HDU 5114 Collision
    HDU 5113 Black And White
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/8992598.html
Copyright © 2011-2022 走看看