1 #include<iostream> 2 #define num 5000 3 #include<cstring> 4 using namespace std; 5 6 int n,m; 7 int f[num]; 8 9 10 typedef struct{ 11 int u,v,next; 12 }z;z edg[num]; 13 int edgs=0,head[10000]; 14 void Addedg(int a,int b){ 15 edgs++; 16 edg[edgs].u=a;edg[edgs].v=b; 17 edg[edgs].next=head[a]; 18 head[a]=edgs; 19 } 20 21 void Init(){ 22 cin>>n>>m; 23 for(int i=1;i<=n;++i) 24 f[i]=i; 25 26 memset(head,-1,sizeof(head)); 27 for(int i=1;i<=m;++i) 28 { 29 int a,b; 30 cin>>a>>b; 31 Addedg(i,b); 32 } 33 } 34 35 bool mark[10000],vis[10000]; 36 int cordnode[100000],top=-1,times=0; 37 int mintime[100000]; 38 void Dfs(int k){ 39 int now; 40 now=mintime[k]=times++; 41 vis[k]=1; 42 cordnode[++top]=k; 43 44 for(int i=head[k];i!=-1;i=edg[i].next) 45 { 46 int v=edg[i].v; 47 if(mark[v]) continue; 48 if(!vis[v]) Dfs(v); 49 if(mintime[k]>mintime[v]) 50 mintime[k]=mintime[v]; 51 } 52 53 if(mintime[k]==now) 54 { 55 while(cordnode[top]!=k) 56 { 57 f[cordnode[top]]=k; 58 mark[cordnode[top]]=1; 59 top--; 60 } 61 f[cordnode[top]]=k; 62 top--; 63 } 64 65 66 } 67 68 int main() 69 { 70 Init(); 71 72 for(int i=1;i<=n;++i) 73 if(!mark[i]) Dfs(i); 74 75 int p[10000]={0}; 76 77 for(int i=1;i<=n;++i) 78 p[f[i]]=1; 79 int ans=0; 80 for(int i=1;i<=n;++i) 81 if(p[i]) ans++; 82 cout<<ans<<endl; 83 system("pause"); 84 85 }
转载于:https://www.cnblogs.com/noip/archive/2012/10/17/2728309.html