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\n");
        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("\n");
        }
    }
    return 0;
}

 

你可能感兴趣的:(排序)