Pagini recente » Cod sursa (job #3248161) | Cod sursa (job #1344265) | Cod sursa (job #79733) | Cod sursa (job #597918) | Cod sursa (job #2077546)
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
int l[maxN],r[maxN];
vector<int> v[maxN];
bool seen[maxN];
int cnt;
vector<int> drum[maxN];
int n,m,x,y;
inline int path(int nod)
{
if(seen[nod]) return 0;
seen[nod]=1;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(!r[*it])
{
l[nod]=*it;
r[*it]=nod;
return 1;
}
}
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(path(r[*it]))
{
l[nod]=*it;
r[*it]=nod;
return 1;
}
}
return 0;
}
int main()
{
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
// v[y].push_back(x);
}
int augment=1;
while(augment)
{
augment=0;
memset(seen,0,sizeof(seen));
for(int i=1;i<=n;i++)
{
if(!l[i]) augment|=path(i);
}
}
int cuplaj=0;
for(int i=1;i<=n;i++)
if(l[i]) cuplaj++;
printf("%d\n",n-cuplaj-1);
for(int i=1;i<=n;i++)
{
if(!r[i])
{
x=i;
cnt++;
while(l[x])
{
drum[cnt].push_back(x);
x=l[x];
}
drum[cnt].push_back(x);
}
}
for(int i=1;i<cnt;i++)
printf("%d %d\n",drum[i].back(),drum[i+1][0]);
for(int i=1;i<=cnt;i++)
{
int sz=drum[i].size();
for(int j=0;j<sz;j++)
printf("%d ",drum[i][j]);
}
return 0;
}