zoukankan      html  css  js  c++  java
  • cdoj 1150 排名表 拓扑排序

    排名表

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/1150

    Description

    暑假前集训已经过了一半了,我们将会把当前排名公布出来。但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了。

    一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的。现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi。(编号从1开始)

    你能帮秋实大哥恢复出排名表吗?

    Input

    第一行一个数字 T (T≤10),表示测试数据组数

    每组测试数据,第一行两个数 n(1≤n≤200)和 m(0≤m≤40000),接下来m行,每行两个数a和b(1≤a,b≤N),表示a的名次要先于b

    Output

    对于每组测试数据,输出一行,从1号到n号每个人的名次。

    如果有多个解,让编号为1的人的名次尽量小,然后让编号为2的人的名次尽量小,然后让编号为3的人的名次尽量小......

    如果没有解,输出−1

    Sample Input

    5
    4 0
    4 1
    1 1
    4 2
    1 2
    2 1
    4 1
    2 1
    4 1
    3 2

    Sample Output

    1 2 3 4
    -1
    -1
    2 1 3 4
    1 3 2 4

    HINT

    题意

    题解:

    逆向拓扑排序,注意,这个是输出每个的排名,而不是按着排名顺序输出人

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 200001
    #define mod 10007
    #define eps 1e-9
    int Num;
    char CH[20];
    //const int inf=0x7fffffff;   //нчоч╢С
    const int inf=0x3f3f3f3f;
    /*
    
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    */
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    //**************************************************************************************
    
    int head[maxn];
    int top;
    int d[maxn];
    priority_queue<int>q;
    struct edge
    {
        int v,next;
    }e[maxn];
    int cnt;
    int ans[maxn];
    int ans1[maxn];
    int n,m;
    void insert(int u,int v)
    {
        e[cnt].v=v;
        e[cnt].next=head[u];
        head[u]=cnt;
        cnt++;
    }
    
    void solve(int x)
    {
        q.pop();
        ans[++top]=x;
        for(int i=head[x];i>=0;i=e[i].next)
        {
            d[e[i].v]--;
            if(d[e[i].v]==0)
                q.push(e[i].v);
        }
    }
    
    int main()
    {
        //freopen("test.txt","r",stdin);
        int t=read();
        while(t--)
        {
            n=read(),m=read();
            cnt=top=0;
            memset(head,-1,sizeof(head));
            memset(d,0,sizeof(d));
            for(int i=1;i<=m;i++)
            {
                int u=read(),v=read();
                insert(v,u);
                d[u]++;
            }
            for(int i=1;i<=n;i++)
                if(!d[i])
                    q.push(i);
            while(!q.empty())
            {
                solve(q.top());
            }
            if(top!=n)
                printf("-1
    ");
            else
            {
                int cnt3=1;
                int first=1;
                for(int i=n;i;i--)
                {
                    ans1[ans[i]]=cnt3++;
                }
                for(int i=1;i<=n;i++)
                {
                    if(i==1)
                        printf("%d",ans1[i]);
                    else
                        printf(" %d",ans1[i]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    SQL 2005的ROW_NUMBER()实现分页的功能
    UML建模工具集
    挽救崩溃的WinXP操作系统四招
    16个经典面试问题回答思路
    自动关闭弹出式窗口
    在winform中嵌入Flash(swf)的方法及常见问题的解决
    C#获取安装程序所在的路径
    转载:C#操作注册表
    C#实现Dll(OCX)控件自动注册的两种方法
    转载:C#创建和修改注册信息
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4562811.html
Copyright © 2011-2022 走看看