Cod sursa(job #2735930)

Utilizator alex.prohnitchiAlex Prohnitchi alex.prohnitchi Data 2 aprilie 2021 23:15:24
Problema Obiective Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>

typedef long long ll;

const ll mod=1e9+7;

const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
const int N = 1e5+5;


#define all(x) x.begin(),x.end()
#define allr(x) x.rbegin(),x.rend()
#define rc(x)  return cout<<x<<"\n",0
#define sz(s)  (int) s.size()
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define PI 3.14159265358979

using namespace std;

int counter,nr,nr1,nr2,ans,cnt;
vector<int>g1[N];
vector<int>g2[N];
int ctc1[N],ctc2[N]; // ctc1 - toate componentele ctc2 - nodurile radacina
int v1[N],v2[N]; // v1 - muchiile out  v2- muchiile in
vector<int>r;
int viz1[N];
stack<int>s;
int in[N],out[N]; // nr de muchii care intra si care ies
void dfs1(int i) {
	if (viz1[i])return;
	viz1[i]=1;
	for (auto it:g1[i]) {
		dfs1(it);
	}
	s.push(i);
}

void dfs2(int i) {
	if(viz1[i]==0)return;
	viz1[i]=0; ctc1[i]=nr;
	for (auto it:g2[i]) {
		dfs2(it);
	}
}
int main() {
	ifstream cin("plan.in");
	ofstream cout("plan.out");
	int n,m;
	cin >> n >> m;
	for (int i=1; i<=m; i++) {
		int x,y;
		cin >> x >> y;
		g1[x].pb(y);
		g2[y].pb(x);
	}
	for (int i=1; i<=n; i++)if(!viz1[i])dfs1(i);
		
	while(!(s.empty())) {
		int nod=s.top();
		s.pop();
		if (viz1[nod]) {
			nr++;
			ctc2[nr]=nod;
			dfs2(nod);
		}
	}
	if (nr==1) {
		cout << "0\n";
		return 0;
	}
	for (int i=1; i<=n; i++) {
		for (int j=0; j<sz(g1[i]); j++) {
			int vecin=g1[i][j];
			if (ctc1[i]!=ctc1[vecin]) {
				out[ctc1[i]]++;
				in[ctc1[vecin]]++;
			}
		}
	}
/*	for (int i=1; i<=n; i++) {
		cout << ctc2[i] << " ";
	}*/
	for (int i=1; i<=nr; i++) {
		if (out[i]==0)v1[++nr1]=ctc2[i]; // muchii de iesire din i
		if (in[i]==0)v2[++nr2]=ctc2[i]; // muchii de intrare in i
	}
	cout << max(nr1,nr2) << "\n";
	
	for (int i=1; i<=max(nr1,nr2); i++) {
		if (i>nr1) {
			cout << v1[1] << " ";
		}
		else cout << v1[i] << " ";
		if (i+1>nr2) {
			cout << v2[1] << " ";
		}
		else cout << v2[i+1] << " ";
		cout << '\n';
	}

}