Pagini recente » Cod sursa (job #958073) | template/despre-infoarena | Cod sursa (job #502611) | Cod sursa (job #1821316) | Cod sursa (job #1240273)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#define F first
#define S second
const int MN = 1e5+100;
bool used[MN];
int cute[MN];
int monesko[MN];
int ufind[MN];
using namespace std;
vector<int> v[MN];
vector<int> pois[MN];
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int find(int a) {
if(ufind[a] == a) return a;
return ufind[a] = find(ufind[a]);
}
int f(int x, int d) {
//cout<<"uusi "<<x+1<<' '<<d<<'\n';
used[x] = 1;
monesko[x] = d;
int sum = 0;
pair<int, int> mi(d, x);
for(int i = 0; i < v[x].size(); ++i) {
int y = v[x][i];
if(!used[y]) {
int q = f(y, d+1);
mi = min(make_pair(monesko[q], q), mi);
}
else {
y = find(y);
if(monesko[y] != 1e9) {
mi = min(make_pair(monesko[y], y), mi);
}
}
}
ufind[x] = mi.S;
monesko[x] = 1e9;
return find(mi.S);
}
void f2(int x, vector<int> & ans) {
used[x] = 1;
ans.push_back(x);
for(int i = 0; i < v[x].size(); ++i) {
if(!used[v[x][i]] && pois[x][i] == 0) {
f2(v[x][i], ans);
}
}
}
vector<int> ans[MN];
int main() {
for(int i = 0; i < MN; ++i) ufind[i] = i, monesko[i] = 1e9;
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,m;
cin>>n>>m;
for(int i = 0; i < m; ++i) {
int q,w;
cin>>q>>w;
--q,--w;
v[q].push_back(w);
pois[q].push_back(0);
}
for(int i = 0; i < n; ++i) {
if(!used[i]) {
f(i, 0);
}
}
//cout<<'\n';
int cnt = 0;
for(int i = 0; i < n; ++i) {
//cout<<i+1<<' '<<find(i)+1<<'\n';
ans[find(i)].push_back(i);
if(ans[find(i)].size() == 1) ++cnt;
}
cout<<cnt<<'\n';
memset(used, 0, sizeof used);
for(int i = 0; i < n; ++i) {
if(!used[i]) {
int q = find(i);
sort(ans[q].begin(), ans[q].end());
for(int j = 0; j < ans[q].size(); ++j) {
cout<<ans[q][j]+1<<' ';
used[ans[q][j]] = 1;
}
cout<<'\n';
}
}
}