题意:重量为1-N的球放在一排,要求第a个球要比第b个球轻,满足条件之后,轻的尽量靠左。。
如果没有DISCUSS里的数据,我连题意都看不懂,,,,
数据:
2 5 4 5 1 4 2 1 3 2 3 10 5 4 1 8 1 7 8 4 1 2 8 ans: 2 4 5 3 1 逆向建图 5 1 6 2 7 8 3 4 9 10 没有判重边的话就输出 -1
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int N = 209; const int M = 40009; int n,m; struct LT{ int nex,to; } L[M]; int F[N],cnt; void add(int f,int t) { L[cnt].nex = F[f]; L[cnt].to = t; F[f] = cnt++; } int in[N]; void init() { memset(F,0,sizeof(F)); memset(in,0,sizeof(in)); cnt = 1; scanf("%d%d",&n,&m); int f,t; for(int i=0;i<m;i++) { scanf("%d%d",&f,&t); add(t,f);in[f]++; } } struct A{ int i,s; bool operator<(const A t) const { return s<t.s; } } ans[N]; void solve() { int i,k,t=n; for(k=0;k<n;k++) { for(i=n;i>0;i--) if(!in[i]) { in[i] = -1; ans[k].s = i; ans[k].i = t--; for(int j=F[i];j;j=L[j].nex) { in[L[j].to]--; } break; } if(i<=0) { printf("-1\n");return ; } } sort(ans,ans+n); for(int i=0;i<n;i++) { if(i) printf(" "); printf("%d",ans[i].i); }printf("\n"); } int main() { freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); while(cas--) { init(); solve(); } return 0; }