Pagini recente » Cod sursa (job #346757) | Cod sursa (job #907795) | Cod sursa (job #2116949) | Cod sursa (job #2117138) | Cod sursa (job #2498873)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
vector<int> g[260];
vector<int> gt[260];
vector<int> l;
vector<int> gcomp[260];
int in[260];
int out[260];
bool ff[260];
vector<int> intro;
vector<int> outro;
struct Solutie
{
int x,y;
};
Solutie sol[260];
Solutie perechi[260];
int f[260];
bool viz[260];
int cont;
vector<int> comp[260];
void dfs(int nod)
{
viz[nod]=1;
for(int v : g[nod])
if(!viz[v])
dfs(v);
l.push_back(nod);
}
void dfst(int nod)
{
viz[nod]=1;
for(int v : gt[nod])
if(!viz[v])
dfst(v);
comp[cont].push_back(nod);
f[nod]=cont;
}
int main()
{ freopen("plan.in", "r", stdin);
freopen("plan.out", "w", stdout);
int n,m,i,x,y,j,k=0,ans=0;
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++){
scanf("%d%d", &x, &y);
g[x].push_back(y);
gt[y].push_back(x);
}
for(i=1; i<=n; i++)
if(!viz[i])
dfs(i);
reverse(l.begin(), l.end());
for(int u : l)
viz[u]=0;
for(int u : l){
if(!viz[u]){
cont++;
dfst(u);
}
}
for(i=1; i<=n; i++)
for(j=0; j<g[i].size(); j++)
if(f[i]!=f[g[i][j]]){
gcomp[f[i]].push_back(f[g[i][j]]);
out[f[i]]++;
in[f[g[i][j]]]++;
}
for(i=1; i<=cont; i++){
if(in[i]==0)
intro.push_back(i);
if(out[i]==0){
outro.push_back(i);
ff[i]=1;
}
}
for(i=0; i<=255; i++)
viz[i]=0;
for(i=0; i<intro.size(); i++)
for(j=0; j<gcomp[intro[i]].size(); j++)
if(ff[gcomp[intro[i]][j]]==1 && viz[gcomp[intro[i]][j]]==0){
viz[gcomp[intro[i]][j]]=1;
viz[intro[i]]=1;
perechi[++k].x=intro[i];
perechi[k].y=gcomp[intro[i]][j];
}
for(i=1; i<k; i++){
sol[++ans].x=comp[perechi[i].y][0];
sol[ans].y=comp[perechi[i+1].x][0];
}
sol[++ans].x=comp[perechi[k].y][0];
sol[ans].y=comp[perechi[1].x][0];
for(i=0; i<intro.size(); i++)
if(viz[intro[i]]==0){
sol[++ans].x=comp[perechi[1].x][0];
sol[ans].y=comp[intro[i]][0];
}
for(i=0; i<outro.size(); i++)
if(viz[outro[i]]==0){
sol[++ans].y=comp[perechi[1].x][0];
sol[ans].x=comp[outro[i]][0];
}
i=0;
j=0;
while(i<intro.size() && j<outro.size()){
while(i<intro.size() && viz[intro[i]]==1)
i++;
while(j<outro.size() && viz[outro[j]]==1)
j++;
if(i<intro.size() && j<outro.size()){
sol[++ans].x=comp[intro[i]][0];
sol[ans].y=comp[outro[j]][0];
x=intro[i];
y=outro[j];
i++;
j++;
}
}
for(; i<intro.size(); i++){
if(viz[intro[i]]==0){
sol[++ans].x=comp[intro[i]][0];
sol[ans].y=comp[y][0];
}
}
for(; j<outro.size(); j++){
if(viz[outro[j]]==0){
sol[++ans].x=comp[x][0];
sol[ans].y=comp[outro[j]][0];
}
}
printf("%d\n", ans);
for(i=1; i<=ans; i++)
printf("%d %d\n", sol[i].x, sol[i].y);
return 0;
}