Pagini recente » Cod sursa (job #2331075) | Cod sursa (job #670262) | Cod sursa (job #555043) | Cod sursa (job #2534951) | Cod sursa (job #2735930)
#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';
}
}