Pagini recente » Cod sursa (job #1134162) | Cod sursa (job #1008825) | Cod sursa (job #337949) | Cod sursa (job #2030746) | Cod sursa (job #987032)
Cod sursa(job #987032)
#include <vector>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <utility>
#include <algorithm>
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 exists[MAX_N][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[b].push_back(a);
exists[a][b] = 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);
//reverse(dfs.begin(),dfs.end());
for(i = 0 ; i < dfs.size() - 1 ; ++ i){
const int now = dfs[i],
next = dfs[i+1];
if(!exists[now][next])
printf("%d %d\n",now,next);
}
for(i = 0 ; i < dfs.size() ; ++ i)
printf("%d ",dfs[i]);
return 0;
}