【使用队列(可以用优先队列限制某些状态) (O(n+m))】
#define rep(i,a,n) for(int i = a; i < n; i++)
#define repe(i,a,n) for(int i = a; i <= n; i++)
#define per(i,n,a) for(int i = n; i >= a; i--)
#define clc(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long LL;
#define MAXN 50
vector<int> g[MAXN];
int in[MAXN], tmp[MAXN],ans[MAXN], t, n;
bool ct;
int topo()//返回-1说明有环,返回1表示找到topo排序,0表示没找到
{
int p = 0, c = 1;
queue<int> q;
rep(i,0,n) if(!in[i]) q.push(i);
while(!q.empty())
{
if(q.size() > 1) c = 0;
int u = q.front();q.pop();
int sz = g[u].size();
rep(i,0,sz)
{
int v = g[u][i];
if(!--in[v]) q.push(v);
}
ans[p++] = u;
}
if(p < n) return -1;
return c;
}