Cod sursa(job #1240273)

Utilizator asdflolasdfasdfasdf asdflolasdf Data 10 octombrie 2014 22:20:54
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#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';
        }
    }
}