#include<iostream> #include <stdio.h> #include<queue> #include<stack> using namespace std; int a[100002][2];//0:next0,以i为头的边链表,1:next1,以i为尾的边链表; bool sign[100002]; int arce[100002][4];//0:i条边的头,1:next0,2:i条边的尾,3:next1; int ccount ; int n,m; bool sign1[100002];//标记i点是否在以k为尾的深度搜索中 stack<int> s; stack<int> ss; void uunion(int x,int y) { if(x==y)return ; int next0=a[y][0]; while(next0!=0) { int temp=next0; next0=arce[next0][1]; if(arce[temp][2]!=x&&sign[arce[temp][2]]) { arce[temp][1]=a[x][0]; a[x][0]=temp; } } int next1=a[y][1]; while(next1!=0) { int temp=next1; next1=arce[next1][3]; if(arce[temp][0]!=x&&sign[arce[temp][0]]) { arce[temp][3]=a[x][1]; a[x][1]=temp; } } } void DFS2(int k) { sign1[k]=true; int next0=a[k][0]; while(next0!=0) { if(sign[arce[next0][2]]&&!sign1[arce[next0][2]])DFS2(arce[next0][2]); next0=arce[next0][1]; } s.push(k); } void DFS3(int k) { sign1[k]=false; int next1=a[k][1]; while(next1!=0){ if(sign1[arce[next1][0]])DFS3(arce[next1][0]); next1=arce[next1][3]; } ss.push(k); } void suodian1(int k) { int i; for(i=1;i<=n;i++) sign1[i]=false; DFS2(k); while(!s.empty()) { int x=s.top();s.pop(); if(sign1[x]) { DFS3(x); while(!ss.empty()) { int y=ss.top();ss.pop(); uunion(x,y); sign1[y]=false; if(x!=y)sign[y]=false; } } } } void suodian() { int i; for(i=1;i<=n;i++) { if(sign[i]) { suodian1(i); } } } void DFS1(int i) { queue<int> q; q.push(i); while(!q.empty()) { int x=q.front(); q.pop(); sign[x]=false; int next0=a[x][0]; while(next0!=0) { if(sign[arce[next0][2]])q.push(arce[next0][2]); next0=arce[next0][1]; } } } void DFS() { int i; for(i=1;i<=n;i++) { if(sign[i]) { int next1=a[i][1]; while(next1!=0) { if(sign[arce[next1][0]]&&arce[next1][0]!=i)break; next1=arce[next1][1]; } if(next1==0)ccount ++,DFS1(i); } } } int main() { int test; scanf("%d",&test); while(test--) { int i; scanf("%d%d",&n,&m); for(i=0;i<=n;i++) sign[i]=true,a[i][0]=0,a[i][1]=0; for(i=1;i<=m;i++) { int x;int y; scanf("%d%d",&x,&y); arce[i][0]=x,arce[i][2]=y; arce[i][1]=a[x][0],a[x][0]=i; arce[i][3]=a[y][1],a[y][1]=i; } ccount =0; DFS(); suodian(); DFS(); printf("%d/n",ccount ); } return 0; }