直接两两关系必定MLE,所以用增加冗余节点的方法。
另外学习到了个预处理
#pragma comment(linker, "/STACK:1024000000,1024000000")
修改默认栈大小,轻松克服RE
/* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #define INF 1E9 using namespace std; #define maxn 100005 struct node { int u; node *next; }; int n,m; node* First[maxn*2]; inline void add(int v,int u) { // cout<<v<<" "<<u<<endl; node *s=new node; s->next=First[v]; s->u=u; First[v]=s; } int a[maxn],b[maxn]; int cnt; bool cmp(int c,int d) { return a[c]<a[d]; } void init() { scanf("%d%d",&n,&m); memset(First,0,sizeof(First)); int i,j,k; cnt=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%d",&a[j]); b[j]=j; } sort(b,b+m,cmp); for(k=0;k<m;k++) { if(a[b[k]]==-1)continue; if(!k||a[b[k]]!=a[b[k-1]])cnt++;//增加冗余节点 add(b[k],m+cnt+1); add(m+cnt,b[k]); } cnt++; } } int inq[maxn*2]; int topo[maxn],t; bool dfs(int u) { inq[u]=-1; for(node *i=First[u];i;i=i->next) { if(inq[i->u]<0) return 0; else if(!inq[i->u]&&!dfs(i->u))return 0; } inq[u]=1; if(u<m) topo[--t]=u; return 1; } bool toposort() { t=m; memset(inq,0,sizeof(inq)); for(int u=0;u<m+cnt;u++) if(!inq[u]&&!dfs(u))return 0; return 1; } int main() { init(); if(!toposort())puts("-1"); else { for(int i=0;i<m;i++) { if(i)putchar(' '); printf("%d",topo[i]+1); } puts(""); } }