cdoj 1150 排名表 拓扑排序

时间:2023-03-09 09:24:56
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[];
//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=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
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>=;i=e[i].next)
{
d[e[i].v]--;
if(d[e[i].v]==)
q.push(e[i].v);
}
} int main()
{
//freopen("test.txt","r",stdin);
int t=read();
while(t--)
{
n=read(),m=read();
cnt=top=;
memset(head,-,sizeof(head));
memset(d,,sizeof(d));
for(int i=;i<=m;i++)
{
int u=read(),v=read();
insert(v,u);
d[u]++;
}
for(int i=;i<=n;i++)
if(!d[i])
q.push(i);
while(!q.empty())
{
solve(q.top());
}
if(top!=n)
printf("-1\n");
else
{
int cnt3=;
int first=;
for(int i=n;i;i--)
{
ans1[ans[i]]=cnt3++;
}
for(int i=;i<=n;i++)
{
if(i==)
printf("%d",ans1[i]);
else
printf(" %d",ans1[i]);
}
printf("\n");
}
}
return ;
}