不会bitset,TAT(这都不会?数据结构白学了?),于是只好暴力水过了,水了12000多MS。。。。。。。。。醉了
先留个坑,以后补上,目测是tarjan+topo+bitset
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=2000+5; struct Edge{int to,next;}e[N*N]; int head[N],ans,T,cnt,vis[N]; void ins(int u,int v){ cnt++;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt; } void dfs(int u){ vis[u]=T;ans++; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(vis[v]==T)continue; vis[v]=T; dfs(v); } } char ch[N]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",ch+1); for(int j=1;j<=n;j++) if(ch[j]-'0')ins(i,j); } for(int i=1;i<=n;i++){ T++; dfs(i); } printf("%d",ans); return 0; }