Pagini recente » Cod sursa (job #2339059) | Cod sursa (job #2069683) | Cod sursa (job #2291964) | Cod sursa (job #1079997) | Cod sursa (job #196799)
Cod sursa(job #196799)
#include<stdio.h>
#include<string.h>
#define N 260
int a[N][N],i,j,n,dr[N],st[N],viz[N],nr,m,r[N][N],u[N];
int cupl(int nod){
int i;
if(viz[nod])
return 0;
viz[nod]=1;
for(i=1;i<=n;i++)
if(a[nod][i])
if(!dr[i]||cupl(dr[i])){
st[nod]=i;
dr[i]=nod;
return 1;
}
return 0;
}
void cuplaj(){
for(i=1;i<=n;i++)
if(!st[i])
if(cupl(i))
nr++;
else{
memset(viz,0,sizeof(viz));
if(cupl(i))
nr++;
}
}
int main(){
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d %d",&n,&m);
for(;m;m--){
scanf("%d %d",&i,&j);
a[i][j]=1;
}
cuplaj();
nr=n;
while(nr){
for(i=1;i<=n;i++)
if(!u[i]&&!dr[i])
break;
r[++m][0]=1;
r[m][1]=i;
u[i]=1;
nr--;
while(st[i]){
i=st[i];
r[m][++r[m][0]]=i;
u[i]=1;
nr--;
}
}
printf("%d\n",m-1);
for(i=1;i<m;i++)
printf("%d %d\n",r[i][r[i][0]],r[i+1][1]);
for(i=1;i<=m;i++)
for(j=1;j<=r[i][0];j++)
printf("%d ",r[i][j]);
fclose(stdin);
fclose(stdout);
return 0;
}