Pagini recente » Cod sursa (job #1086046) | Cod sursa (job #275092) | Cod sursa (job #2417812) | Cod sursa (job #1769484) | Cod sursa (job #2861528)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
using namespace std;
/// infoarena DFS
/// de terminat
ifstream fin("dfs.in");ofstream fout("dfs.out");
int n,m,sol,v[100001],id[100001];
struct muchie
{
int x,y;
}U[200001];
bool ordine(muchie id1,muchie id2)
{
if (id1.x!=id2.x)
return id1.x<id2.x;
return id1.y<id2.y;
}
int find_id(int val,int lo,int hi)
{
if(lo>hi)
return -1;
else
{
int mid=(lo+hi)/2;
if (U[mid].x==val)
{
while (U[mid].x==val)
mid--;
return mid+1;
}
else
{
if (U[mid].x>val)
return find_id(val,lo,mid-1);
else
return find_id(val,mid+1,hi);
}
}
}
void unire(int val1,int val2)
{
sol--;
for (int i=1;i<=n;i++)
if (v[i]==val2)
v[i]=val1;
}
void DFS()
{
int f[n+1];
for (int i=1;i<=n;i++)
f[i]=0;
stack <int> S;
for (int start=1;start<=n;start++)
{
if (v[start]==start)
{
S.push(start);
while(!S.empty())
{
int nod=S.top();
int ok=0;
if (id[start]!=-1)
for (int i=id[nod];U[i].x==nod;i++)
{
if (v[U[i].x]!=v[U[i].y] && f[U[i].y]==0)
{
unire(U[i].x,U[i].y);
f[U[i].y]=1;
S.push(U[i].y);
}
}
if (ok==0)
S.pop();
}
}
}
}
int main()
{
fin>>n>>m;
sol=n;
for (int i=1;i<=m;i++)
fin>>U[i].x>>U[i].y;
sort(U+1,U+m+1,ordine);
id[0]=0;
for (int i=1;i<=n;i++)
{
id[i]=find_id(i,id[i-1]+1,m+1);
v[i]=i;
}
DFS();
fout<<sol;
return 0;
}