Pagini recente » Cod sursa (job #2610217) | Cod sursa (job #1199678) | Cod sursa (job #1598334) | Cod sursa (job #1598346) | Cod sursa (job #966507)
Cod sursa(job #966507)
#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;
}