Pagini recente » Cod sursa (job #1762373) | Cod sursa (job #171151) | Cod sursa (job #61798) | Cod sursa (job #1140575) | Cod sursa (job #987010)
Cod sursa(job #987010)
#include <vector>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <utility>
using namespace std;
ifstream f_in("strazi.in");
const int MAX_N = 260;
vector<int> G[MAX_N];
int n,m;
int mate[MAX_N];
int taken_by[MAX_N];
bool init[MAX_N];
bool viz[MAX_N];
bool pair_up(const int nod)
{
if(viz[nod])
return false;
viz[nod] = 1;
for(auto it:G[nod]){
if(!taken_by[it]){
mate[nod] = it;
taken_by[it] = nod;
return true;
}
}
for(auto it:G[nod]){
if(pair_up(taken_by[it])){
mate[nod] = it;
taken_by[it] = nod;
return true;
}
}
return false;
}
void match()
{
int i;
bool matched = true;
while(matched){
matched = false;
for(i = 1 ; i <= n ; ++ i)
if(!viz[i] && !mate[i])
matched |= pair_up(i);
memset(viz,0,sizeof(viz));
}
}
vector<int> dfs;
void road(const int nod)
{
dfs.push_back(nod);
if(taken_by[nod])
road(taken_by[nod]);
}
int main()
{
freopen("strazi.out", "w", stdout);;
f_in >> n >> m;
int i,a,b;
for(i = 1 ; i <= m ; ++ i){
f_in >> a >> b;
G[a].push_back(b);
init[a] = true;
}
match();
int extra = -1;
for(i = 1 ; i <= n ; ++ i)
extra += mate[i] == 0;
printf("%d\n",extra);
for(i = 1 ; i <= n ; ++ i)
if(!mate[i])
road(i);
for(i = 0 ; i < dfs.size() - 1 ; ++ i){
const int now = dfs[i],
next = dfs[i+1];
if(init[now])continue;
printf("%d %d\n",now,next);
}
for(i = 0 ; i < dfs.size() ; ++ i)
printf("%d ",dfs[i]);
return 0;
}