Cod sursa(job #2556753)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 25 februarie 2020 10:23:52
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 1.37 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("drumuri5.in");
ofstream fout("drumuri5.out");
int low[150010],niv[150010],d[150010],n,i,j,lvl,a,b,nr,k,f[150010];
int fup[150010],fdown[150010];
vector<int> s,sol[150010],v[150010],l1[150010],l2[150010];
bitset<150010> f1[150010],f2[150010];
map<pair<int,int> ,bool> m;
void dfs(int nod)
{
    low[nod]=++lvl;niv[nod]=lvl;
    d[nod]=1;
    s.push_back(nod);
    for(auto it:v[nod])
    {
        if(niv[it]&&d[it]) low[nod]=min(low[nod],niv[it]);
        if(niv[it]==0){dfs(it);low[nod]=min(low[nod],low[it]);}
    }
    if(niv[nod]==low[nod])
    {
        ++nr;
        for(;s.back()!=nod;){sol[nr].push_back(s.back());f[s.back()]=nr;d[s.back()]=0;s.pop_back();}
        sol[nr].push_back(s.back());d[s.back()]=0;f[s.back()]=nr;s.pop_back();
    }
}

void

int main()
{
    fin>>n>>k;
    for(i=1;i<=k;i++)
    {
        fin>>a>>b;
        v[a].push_back(b);
    }
    for(i=1;i<=n;i++)if(niv[i]==0)dfs(i);
    for(i=1;i<=nr;i++)
    {
        for(auto it:sol[i]) for(auto vec:v[it])
        if(f[it]!=f[vec]&&m[{f[it],f[vec]}]==0)
        {
            m[{f[it],f[vec]}]=1;
            l1[f[it]].push_back(f[vec]);
            l2[f[vec]].push_back(f[it]);
        }
    }
    for(i=1;i<=nr;i++) if(fup[i]==0) dfsup(i);
    for(i=nr;i>=1;i--) if(fdown[i]==0) dfsdown(i);
    return 0;
}