Cod sursa(job #966507)

Utilizator geniucosOncescu Costin geniucos Data 26 iunie 2013 00:35:55
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int poz,nr,n,m,i,x1,y11,ctc,ap[100003],Q[100003],x[200003],y[200003];
vector < int > v[100003],h[100003],muc[100003];
vector < int > ::iterator it;
queue < int > cc;
void dfs(int nod)
{
    vector < int > ::iterator it;
    ap[nod]=1;
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(ap[*it]==0) dfs(*it);
    nr++;
    Q[nr]=nod;
}
void push(int x,int y)
{
    muc[x].push_back(y);
    muc[y].push_back(x);
}
bool exist(int x,int y)
{
    for(it=muc[x].begin();it!=muc[x].end();it++)
        if(*it==y) return 1;
    return 0;
}
int main()
{
freopen("drum4.in","r",stdin);
freopen("drum4.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
    scanf("%d",&x1);
    scanf("%d",&y11);
    x[i]=x1;
    y[i]=y11;
    v[x1].push_back(y11);
    h[y11].push_back(x1);
}
for(i=1;i<=n;i++)
    if(ap[i]==0) dfs(i);
for(i=1;i<=n;i++)
    ap[i]=0;
poz=nr;
ctc=0;
while(1)
{
    while(ap[Q[poz]]!=0) poz--;
    if(poz==0) break;
    ctc++;
    cc.push(Q[poz]);
    ap[Q[poz]]=ctc;
    while(!cc.empty())
    {
        x1=cc.front();
        cc.pop();
        for(it=h[x1].begin();it!=h[x1].end();it++)
            if(ap[*it]==0)
            {
                ap[*it]=ctc;
                cc.push(*it);
            }
    }
}
if(ctc==1) printf("0\n");
else
{
    for(i=1;i<=m;i++)
        if(ap[x[i]]!=ap[y[i]]&&!exist(ap[x[i]],ap[y[i]]))
        {
            push(ap[x[i]],ap[y[i]]);
            ctc--;
        }
    printf("%d\n",ctc);
}
return 0;
}