#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define SZ 100009
using namespace std;
long N,M,l;
vector<long>graph[SZ];
long color[SZ];
long topsort[SZ];
void SCC(long p)
{
color[p]=1;
for(long k=0; k<graph[p].size(); k++)
{
if(color[graph[p][k]]==0)
{
SCC(graph[p][k]);
}
}
topsort[l++]=p;
}
void SCC1(long p)
{
color[p]=1;
for(long i=0;i<graph[p].size();i++)
{
if(color[graph[p][i]]==0)
{
SCC1(graph[p][i]);
}
}
}
int main()
{
long i,j,counter,test,x,MIN,a,b,u;
scanf("%ld",&test);
for(x=1; x<=test; x++)
{
scanf("%ld%ld",&N,&M);
for(i=1; i<=M; i++)
{
scanf("%ld%ld",&a,&b);
graph[a].push_back(b);
}
l=0;
for(j=1; j<=N; j++)
{
if(color[j]==0)
{
SCC(j);
}
}
memset(color,0,sizeof(color));
counter=0;
for(i=l-1;i>=0;i--)
{
long u = topsort[i];
if(color[u]==0)
{
counter++;
SCC1(u);
}
}
printf("%ld\n",counter);
for(i=0; i<=N; i++)
{
graph[i].clear();
}
memset(color,0,sizeof(color));
}
return 0;
}
#include<cstring>
#include<iostream>
#include<vector>
#define SZ 100009
using namespace std;
long N,M,l;
vector<long>graph[SZ];
long color[SZ];
long topsort[SZ];
void SCC(long p)
{
color[p]=1;
for(long k=0; k<graph[p].size(); k++)
{
if(color[graph[p][k]]==0)
{
SCC(graph[p][k]);
}
}
topsort[l++]=p;
}
void SCC1(long p)
{
color[p]=1;
for(long i=0;i<graph[p].size();i++)
{
if(color[graph[p][i]]==0)
{
SCC1(graph[p][i]);
}
}
}
int main()
{
long i,j,counter,test,x,MIN,a,b,u;
scanf("%ld",&test);
for(x=1; x<=test; x++)
{
scanf("%ld%ld",&N,&M);
for(i=1; i<=M; i++)
{
scanf("%ld%ld",&a,&b);
graph[a].push_back(b);
}
l=0;
for(j=1; j<=N; j++)
{
if(color[j]==0)
{
SCC(j);
}
}
memset(color,0,sizeof(color));
counter=0;
for(i=l-1;i>=0;i--)
{
long u = topsort[i];
if(color[u]==0)
{
counter++;
SCC1(u);
}
}
printf("%ld\n",counter);
for(i=0; i<=N; i++)
{
graph[i].clear();
}
memset(color,0,sizeof(color));
}
return 0;
}
0 comments: (+add yours?)
Post a Comment