Pagini recente » Cod sursa (job #1351413) | Cod sursa (job #2578650) | Cod sursa (job #333280) | Cod sursa (job #2734621) | Cod sursa (job #2368562)
//doar de test
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
vector<int> v[100005];
stack<int> stiva;
const long long INF = 1000000;
int n,m,nrc,idx;
int lowlink[100005],id[100005];
vector< vector<int> > ctc;
//int ad[260][260];
void dfs(int x)
{
int y,i;
idx++;
lowlink[x]=idx;
id[x]=idx;
stiva.push(x);
for (i=0;i<v[x].size();i++)
{
y=v[x][i];
if (id[y]==-1)
dfs(y);
lowlink[x]=min(lowlink[x],lowlink[y]);
}
if (lowlink[x]==id[x])
{
vector<int> comp;
while (true)
{
i=stiva.top();
stiva.pop();
id[i]=INF;
lowlink[i]=INF;
comp.push_back(i);
//cout<<i<<" ";
if (x==i)
break;
}
ctc.push_back(comp);
nrc++;
}
}
int main()
{
int x,y,i,j,k;
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y;
v[x].push_back(y);
//ad[x][y]=1;
}
for (i=1;i<=n;i++)
id[i]=-1;
for (i=1;i<=n;i++)
{
if (id[i]==-1)
dfs(i);
}
/*
int ok=0;
vector< pair<int,int> > sol;
for (k=1;k<ctc.size();k++)
{
ok=0;
for (i=0;i<ctc[k].size() && ok==0;i++)
{
x=ctc[k][i];
for (j=0;j<ctc[0].size() && ok==0;j++)
{
y=ctc[0][j];
if (ad[x][y]==1 || ad[y][x]==1)
{
if (ad[x][y]==1)
sol.push_back(make_pair(y,x));
else sol.push_back(make_pair(x,y));
ad[x][y]=ad[y][x]=1;
ok=1;
}
}
}
if (ok==0)
{
ad[x][y]=ad[y][x]=1;
sol.push_back(make_pair(x,y));
sol.push_back(make_pair(y,x));
}
}
g<<sol.size()<<'\n';
for (i=0;i<sol.size();i++)
{
g<<sol[i].first<<" "<<sol[i].second<<'\n';
}
*/
g<<nrc<<'\n';
for (i=0;i<nrc;i++)
{
for (j=ctc[i].size()-1;j>=0;j--)
g<<ctc[i][j]<<" ";
g<<'\n';
}
return 0;
}