有长度为 \(n\) 的序列 \(x\{n\}\),需要满足 \(m\) 个条件...
这篇文章还没有写完!不要D蒟蒻KonnyWen!
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x(a) a.first
#define y(a) a.second
#define b(a) a.begin()
#define e(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
//Data
const int N=2e5;
int n,m,d[N+7],f[N+7],b[N+7],sm,ans[N+7];
vector<int> e[N+7],g[N+7];
//Bfs
int Bfs(vector<int>&q){
q.clear();
for(int i=1;i<=n;i++)if(!d[i]) q.pb(i);
for(int i=0;i<sz(q);i++)
for(int to:e[q[i]])if(!--d[to]) q.pb(to);
return sz(q)==n;
}
//Main
int main(){
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),e[u].pb(v),g[v].pb(u);
for(int i=1;i<=n;i++) d[i]=sz(g[i]);
vector<int> tp;
if(!Bfs(tp)) return puts("-1"),0;
iota(f+1,f+n+1,1),iota(b+1,b+n+1,1);
for(int i=0;i<=sz(tp)-1;i++)
for(int to:g[tp[i]]) f[tp[i]]=min(f[tp[i]],f[to]);
for(int i=sz(tp)-1;i>=0;i--)
for(int to:e[tp[i]]) b[tp[i]]=min(b[tp[i]],b[to]);
for(int i=1;i<=n;i++)if(min(f[i],b[i])==i) sm++,ans[i]=1;
printf("%d\n",sm);
for(int i=1;i<=n;i++) putchar("EA"[ans[i]]);puts("");
return 0;
}