Pagini recente » Cod sursa (job #2904971) | Cod sursa (job #2782511) | Cod sursa (job #1933563) | Cod sursa (job #629261) | Cod sursa (job #2556753)
#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;
}