Cod sursa(job #3030382)

Utilizator BadHero112Ursu Vasile BadHero112 Data 17 martie 2023 17:23:05
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=100001;
using namespace std;

int n,m,chk[maxn],id[maxn];
vector<vector<int>> A(maxn,vector<int>()),B(maxn,vector<int>());
vector<int> L;

void dfs1(int i){
	chk[i]=1;
	for(int j=0;j<A[i].size();j++){
		if(!chk[A[i][j]])dfs1(A[i][j]);
	}
	L.push_back(i);
}

void dfs2(int i,int comp){
	chk[i]=0;
	id[i]=comp;
	for(int j=0;j<B[i].size();j++){
		if(chk[B[i][j]])dfs2(B[i][j],comp);
	}
}

int main(){
	ifstream cin("ctc.in");
	ofstream cout("ctc.out");
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int c1,c2;
		cin>>c1>>c2;
		c1--;
		c2--;
		A[c1].push_back(c2);
		B[c2].push_back(c1);
	}
	for(int i=0;i<n;i++){
		if(!chk[i])dfs1(i);
	}
	int cnt=1;
	for(int i=n-1;i>=0;i--){
		if(chk[L[i]]){
			dfs2(L[i],cnt);
			cnt++;
		}
	}
	//cout<<endl;
	//for(int i=0;i<n;i++)cout<<L[i]<<" ";
	//for(int i=0;i<n;i++)cout<<id[i]<<" ";
	cout<<cnt-1<<endl;
	vector<pair<int,int>> C;
	for(int i=0;i<n;i++){
		C.push_back({id[i],i});
	}
	sort(C.begin(),C.end());
	int curr=1;
	for(int i=0;i<n;i++){
		if(C[i].F!=curr){
			cout<<endl;
			curr=C[i].F;
		}
		cout<<C[i].S+1<<" ";
	}
}