#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
#define N 20005
vector<int> s[N];
stack<int> _stack;
int pre[N],sccno[N],dfs_clock,scc_cnt;
int in[N],out[N];
int dfs(int u,int fa){
int lowu,lowv,i;
lowu=pre[u]=++dfs_clock;
_stack.push(u);
for(i=0;i<s[u].size();i++){
int v=s[u][i];
if(!pre[v]){
lowv=dfs(v,u);
lowu=min(lowu,lowv);
}
else if(!sccno[v]){
lowu=min(lowu,pre[v]);
}
}
if(lowu==pre[u]){
++scc_cnt;
while(1){
int x=_stack.top();
_stack.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
return lowu;
}
int main(){
int t,n,m,x,y,i,j,A,B;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(in,-1,sizeof(in));
memset(out,-1,sizeof(out));
memset(pre,0,sizeof(pre));
memset(sccno,0,sizeof(sccno));
A=B=scc_cnt=0;
for(i=1;i<=n;i++)
s[i].clear();
for(i=0;i<m;i++){
scanf("%d%d",&x,&y);
s[x].push_back(y);
}
for(i=1;i<=n;i++){
dfs_clock=0;
if(!pre[i]){
dfs(i,-1);
}
}
for(i=1;i<=n;i++){
for(j=0;j<s[i].size();j++){
int v=s[i][j];
if(sccno[i]!=sccno[v]){
in[sccno[v]]=0;
out[sccno[i]]=0;
}
}
}
for(i=1;i<=scc_cnt;i++){
if(in[i]) A++;
if(out[i]) B++;
}
int ans=max(A,B);
if(scc_cnt==1) ans=0;
printf("%d\n",ans);
}
}
沒有留言:
張貼留言