cdoj 1150 排名表 拓扑排序
排名表
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1150
Description
暑假前集训已经过了一半了,我们将会把当前排名公布出来。但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了。
一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的。现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi。(编号从1开始)
你能帮秋实大哥恢复出排名表吗?
一共有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
每组测试数据,第一行两个数 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; }