不废话了直接%%%%%%%%%%%%%%%%%%%%%%%%%%%%
正文
一看到自动机就好虚啊
tarjan写错3次感觉药丸
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<stack> #include<vector> using namespace std; struct Edge{int to,next;}e[20005]; int head[55],cnt; void ins(int u,int v){ e[++cnt]=(Edge){v,head[u]};head[u]=cnt; } stack<int>s; int dfn[55],dfs_clock,sccno[55],w[55],scc_cnt; int tarjan(int u){ int lowu=dfn[u]=++dfs_clock; s.push(u); for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(!dfn[v])lowu=min(lowu,tarjan(v)); else if(!sccno[v])lowu=min(lowu,dfn[v]); } if(lowu==dfn[u]){ scc_cnt++; while(true){ int x=s.top();s.pop(); sccno[x]=scc_cnt;w[scc_cnt]++; if(x==u)break; } } return lowu; } vector<int>g[55]; int deg[55],f[55]; int toposort(){ queue<int>q; for(int i=1;i<=scc_cnt;i++) for(int j=0;j<g[i].size();j++) deg[g[i][j]]++; for(int i=1;i<=scc_cnt;i++) if(!deg[i])q.push(i); while(!q.empty()){ int u=q.front();q.pop(); f[u]+=w[u]; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; f[v]=max(f[v],f[u]); deg[v]--;if(!deg[v])q.push(v); } } int ans=0; for(int i=1;i<=scc_cnt;i++) ans=max(ans,f[i]); return ans; } bool output[55][55]; bool vis[55][55]; int p0[55][55],p1[55][55]; bool bfs(int i,int j){ memset(vis,0,sizeof(vis)); queue<int>qi,qj; qi.push(0);qj.push(0); vis[0][0]=1; while(!qi.empty()){ int u=qi.front(),v=qj.front(); qi.pop();qj.pop(); if(output[i][u]&&!output[j][v])return false; int x=p0[i][u],y=p0[j][v]; if(!vis[x][y])qi.push(x),qj.push(y),vis[x][y]=1; x=p1[i][u],y=p1[j][v]; if(!vis[x][y])qi.push(x),qj.push(y),vis[x][y]=1; } return true; } int main(){ //freopen("a.in","r",stdin); int n;scanf("%d",&n); for(int i=1;i<=n;i++){ int k,m;scanf("%d%d",&k,&m); for(int j=1;j<=m;j++){ int x;scanf("%d",&x); output[i][x]=1; } for(int j=0;j<k;j++) scanf("%d%d",&p0[i][j],&p1[i][j]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&bfs(i,j))ins(i,j); for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i); for(int u=1;u<=n;u++) for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(sccno[u]!=sccno[v]) g[sccno[u]].push_back(sccno[v]); } printf("%d\n",toposort()); return 0; }