Pagini recente » Cod sursa (job #2699406) | Cod sursa (job #92288) | Cod sursa (job #2338835) | Cod sursa (job #1002707) | Cod sursa (job #570611)
Cod sursa(job #570611)
#include<stdio.h>
#include<vector>
using namespace std;
#define pb push_back
#define NMAX 305
char viz[NMAX];
int st[NMAX],dr[NMAX];
int n,m,drum[NMAX],nr;
vector <int> v[NMAX];
int cupleaza(int nod)
{
int i,x,lim;
if(viz[nod])
return 0;
viz[nod]=1;
lim=v[nod].size();
for(i=0;i<lim;i++)
if(!dr[x=v[nod][i]])
{
dr[x]=nod;
st[nod]=x;
return 1;
}
for(i=0;i<lim;i++)
if(cupleaza(dr[x=v[nod][i]]))
{
dr[x]=nod;
st[nod]=x;
return 1;
}
return 0;
}
int main ()
{
int i,ok,a,b,x,sol=0;
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
v[a].pb(b);
}
ok=1;
while(ok)
{
ok=0;
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++)
if(!st[i])
ok|=cupleaza(i);
}
for(i=1;i<=n;i++)
if(!st[i])
sol++;
sol--;
printf("%d\n",sol);
for(i=1;i<=n;i++)
if(!dr[i])
{
for(x=i;st[x];x=st[x])
drum[++nr]=x;
drum[++nr]=x;
}
for(i=1;i<=n && sol;i++)
if(!st[drum[i]])
{
printf("%d %d\n", drum[i],drum[i+1]);
sol--;
}
for(i=1;i<=nr;i++)
printf("%d ",drum[i]);
printf("\n");
return 0;
}