Pagini recente » Cod sursa (job #1077456) | Cod sursa (job #2101384) | Cod sursa (job #1976353) | Cod sursa (job #45346) | Cod sursa (job #903229)
Cod sursa(job #903229)
//HighFlow
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <stack>
#include <fstream>
#include <string.h>
#include <cmath>
#include <algorithm>
#define fcat(c) while (c!='\n') fscanf(f,"%c",&c)
#define cat(c) while (c!='\n') scanf("%c",&c)
#define For(i,st,dr,k) for (int i=st;i<=dr;i+=k)
#define ll (long long)
using namespace std;
FILE *f,*g;
int n,m;
vector <int> a[100100];
vector <vector <int> > sol;
stack<int> q;
int ind[100100],mn[100100];
int nv;
bool in_q[100100];
void read()
{
int i,x,y;
f=fopen("ctc.in","r");
g=fopen("ctc.out","w");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
a[x].push_back(y);
}
}
void df(int x)
{
int i;
ind[x]=mn[x]=++nv;
q.push(x);
in_q[x]=1;
for (i=0;i<a[x].size();i++)
{
if (ind[a[x][i]]==0)
{
df(a[x][i]);
mn[x]=min(mn[x],mn[a[x][i]]);
}
else
if (in_q[a[x][i]])
mn[x]=min(mn[x],mn[a[x][i]]);
}
if (ind[x]==mn[x])
{
vector <int> con;
int y;
do
{
y=q.top();q.pop();
con.push_back(y);
in_q[y]=0;
}
while (y!=x);
sol.push_back(con);
}
}
void solve()
{
int i;
for (i=1;i<=n;i++)
if (ind[i]==0)
df(i);
}
void write()
{
int i,j;
fprintf(g,"%d\n",sol.size());
for (i=0;i<sol.size();i++,fprintf(g,"\n"))
for (j=0;j<sol[i].size();j++)
fprintf(g,"%d ",sol[i][j]);
}
int main()
{
read();
solve();
write();
return 0;
}