View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #define N 20010 5 using namespace std; 6 int dfn[N]; 7 int low[N]; 8 int instack[N]; 9 int stack[N]; 10 int belong[N]; 11 int in[N]; 12 int out[N]; 13 int visnum; 14 int cnt; 15 int stop; 16 17 int n,m; 18 vector<int>node[N]; 19 void tarjan(int x) 20 { 21 22 23 dfn[x]=low[x]=++visnum; 24 instack[x]=1; 25 stack[++stop]=x; 26 int j; 27 for(int i=0;i<node[x].size();i++) 28 { 29 30 31 j=node[x][i]; 32 if(dfn[j]==0) 33 { 34 tarjan(j); 35 if(low[x]>low[j]) 36 low[x]=low[j]; 37 } 38 else if(instack[j]==1&&low[x]>dfn[j]) 39 low[x]=dfn[j]; 40 41 42 } 43 44 if(dfn[x]==low[x]) 45 { 46 47 48 cnt++; 49 do 50 { 51 j=stack[stop--]; 52 belong[j]=cnt; 53 instack[j]=0; 54 }while(x!=j); 55 56 } 57 58 } 59 int maxa(int x,int y) 60 { 61 62 63 int s; 64 if(x>y) s=x; 65 else s=y; 66 return s; 67 } 68 void init() 69 { 70 71 72 memset(dfn,0,sizeof(dfn)); 73 memset(low,0,sizeof(low)); 74 memset(instack,0,sizeof(instack)); 75 memset(node,0,sizeof(node)); 76 memset(in,0,sizeof(in)); 77 memset(out,0,sizeof(out)); 78 visnum=0; 79 cnt=0; 80 stop=0; 81 } 82 int main() 83 { 84 85 86 int a,b; 87 int i,j; 88 int t; 89 scanf("%d",&t); 90 while(t--){ 91 scanf("%d%d",&n,&m); 92 if(m==0) 93 { 94 95 96 printf("%d\n",n); 97 continue; 98 } 99 100 101 102 103 init(); 104 for(i=0;i<m;i++) 105 { 106 107 108 scanf("%d%d",&a,&b); 109 node[a].push_back(b); 110 111 } 112 113 for(i=1;i<=n;i++) 114 { 115 116 117 if(dfn[i]==0) 118 tarjan(i); 119 } 120 int s,e; 121 if(cnt==1) printf("0\n"); 122 else 123 { 124 125 126 for(i=1;i<=n;i++) 127 for(j=0;j<node[i].size();j++) 128 { 129 130 131 s=belong[i]; 132 e=belong[node[i][j]]; 133 if(s!=e) 134 { 135 136 137 in[e]=1; 138 out[s]=1; 139 } 140 } 141 int x=0; 142 int y=0; 143 144 145 146 147 for(i=1;i<=cnt;i++) 148 { 149 150 151 if(!in[i]) 152 x++; 153 if(!out[i]) 154 y++; 155 } 156 157 printf("%d\n",maxa(x,y)); 158 } 159 } 160 161 }