11504 - Dominos

#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;
}

0 comments: (+add yours?)