Cod sursa(job #2861528)

Utilizator vladIordaIordachescu Vlad vladIorda Data 4 martie 2022 09:11:32
Problema Parcurgere DFS - componente conexe Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#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;
}