Pagini recente » Cod sursa (job #1407296) | Cod sursa (job #1066352) | Cod sursa (job #1407460) | Cod sursa (job #2624982) | Cod sursa (job #964507)
Cod sursa(job #964507)
/// plus-minus
/// 1.0
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
const int N = 100005;
vector <int> G[N] , nodes, Gt[N], adj(N), sol[N];
vector <short> used(N);
int n, m, ccount;
void read()
{
cin >> n >> m;
for(int i = 1 ; i <= m ; ++ i)
{
int x, y;
cin >> x >> y;
G[x].push_back(y);
Gt[y].push_back(x);
}
}
void dfp(int node) /// marcheaza cu plus
{
used[node] = 1;
for(vector<int> ::iterator it = G[node].begin(); it != G[node].end(); ++ it)
if(!used[*it])
dfp(*it);
adj.push_back(node);
}
void dfm(int node)
{
used[node] = 2;
for(vector<int> :: iterator it = Gt[node].begin(); it != Gt[node].end(); ++ it)
if(used[*it] == 1)
dfm(*it);
sol[ccount].push_back(node);
}
void plus_minus()
{
for(int i = 1 ; i <= n ; ++ i)
nodes.push_back(i);
random_shuffle(nodes.begin(), nodes.end());
for(int i = 0 ; i < n ; ++ i)
if(!used[ nodes[i] ])
{
adj.clear();
dfp(nodes[i]);
++ccount;
dfm(nodes[i]);
for(vector <int> :: iterator it = adj.begin(); it != adj.end(); ++ it)
if(used[*it] == 1)
used[*it] = 0;
}
}
void write()
{
cout << ccount << "\n";
for(int i = 1 ; i <= ccount; ++ i)
{for(vector <int> :: iterator it = sol[i].begin(); it != sol[i].end(); ++ it)
cout << *it << " " ;
cout << "\n";}
}
int main()
{
read();
plus_minus();
write();
return 0;
}