Pagini recente » Cod sursa (job #1501118) | Cod sursa (job #2330563) | Cod sursa (job #1012990) | Cod sursa (job #368728) | Cod sursa (job #1502925)
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
vector<int>L[300],S[300],R[300];
stack<int>s;
struct muc{
int x;
int y;
}Q[300];
int n,m,i,j,k,a,b,nr,nrr,ni,no,v[300],x[300],low[300],niv[300],gc[300],I[300],O[300],y[300][300],H[300],E[300];
FILE *f,*g;
int minim(int a,int b){
if(a<b)
return a;
return b;
}
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
void dfs(int nod){
v[nod]=x[nod]=1;
a++;
low[nod]=niv[nod]=a;
s.push(nod);
for(int i=0;i<L[nod].size();i++){
if(v[ L[nod][i] ]==0){
dfs(L[nod][i]);
low[nod]=minim( low[nod] , low[ L[nod][i] ] );
}
else if(x[ L[nod][i] ]==1)
low[nod]=minim( low[nod] , low[ L[nod][i] ] );
}
if(low[nod]==niv[nod]){
nr++;
do{
b=s.top();
s.pop();
x[b]=0;
gc[b]=nr;
S[nr].push_back(b);
}while(b!=nod);
}
}
void dfss(int nod){
v[nod]=1;
if(O[nod]==0)
a=nod;
for(int i=0;i<R[nod].size();i++){
if( v[ L[nod][i] ] == 0 )
dfs( L[nod][i] );
}
}
int main(){
f=fopen("plan.in","r");
g=fopen("plan.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++){
fscanf(f,"%d%d",&a,&b);
L[a].push_back(b);
}
a=0;
for(i=1;i<=n;i++){
if(v[i]==0){
dfs(i);
}
}
for(i=1;i<=nr;i++){
for(j=0;j<S[i].size();j++){
a=S[i][j];
for(k=0;k<L[a].size();k++){
if( i != gc[ L[a][k] ] && y[i][ gc[ L[a][k] ] ] == 0 ){
R[i].push_back( gc[ L[a][k] ] );
I[ gc[ L[a][k] ] ]++;
O[i]++;
y[i][ gc[ L[a][k] ] ]=1;
}
}
}
v[i]=0;
}
for(i=1;i<=nr;i++){
if(I[i]==0)
ni++;
if(O[i]==0)
no++;
}
fprintf(g,"%d\n",maxim(ni,no));
for(i=1;i<=nr;i++){
if(v[i]==0&&I[i]==0){
dfss(i);
R[a].push_back(i);
O[a]++;
I[i]++;
Q[++nrr].x=S[a][0];
Q[nrr].y=S[i][0];
}
}
ni=no=0;
for(i=1;i<=nr;i++){
if(I[i]==0)
H[++ni]=i;
if(O[i]==0)
E[++no]=i;
}
a=minim(ni,no);
for(i=1;i<=a;i++){
R[ E[i] ].push_back( H[i] );
Q[++nrr].x=S[ E[i] ][0];
Q[nrr].y=S[ H[i] ][0];
}
if(ni-a!=0){
for(i=a+1;i<=ni;i++){
R[ E[a] ].push_back(H[i]);
Q[++nrr].x=S[ E[a] ][0];
Q[nrr].y=S[ H[i] ][0];
}
}
if(no-a!=0){
for(i=a+1;i<=no;i++){
R[ E[i] ].push_back(H[a]);
Q[++nrr].x=S[ E[i] ][0];
Q[nrr].y=S[ H[a] ][0];
}
}
for(i=1;i<=nrr;i++){
fprintf(g,"%d %d\n",Q[i].x,Q[i].y);
}
fclose(f);
fclose(g);
return 0;
}