Pagini recente » Cod sursa (job #757199) | Cod sursa (job #1529702) | Cod sursa (job #280370) | Cod sursa (job #858024) | Cod sursa (job #1825695)
#include <stdio.h>
#include <vector>
#include <cctype>
#include <string.h>
#define BUF_SIZE 1<<17
char buffer[BUF_SIZE];
int pbuf = BUF_SIZE;
FILE *fi, *fo;
inline char nextch(){
if(pbuf == BUF_SIZE){
fread(buffer, BUF_SIZE, 1, fi);
pbuf=0;
}
return buffer[pbuf++];
}
inline int nextnum(){
int a = 0;
char c = nextch();
while(!isdigit(c))
c = nextch();
while(isdigit(c)){
a = a*10+c-'0';
c = nextch();
}
return a;
}
#define MAXN 10000
std::vector < int > G[1 + MAXN];
int viz[1 + MAXN];
int x;
int left[1 + MAXN], right[1 + MAXN];
bool src(int node){
if(viz[node] == x) return 0;
viz[node] = x;
for(auto y: G[node])
if(!right[y]){
left[node] = y;
right[y] = node;
return 1;
}
for(auto y: G[node])
if(src(right[y])){
left[node] = y;
right[y] = node;
return 1;
}
return 0;
}
int main(){
fi = fopen("cuplaj.in","r");
fo = fopen("cuplaj.out","w");
int n = nextnum(), m = nextnum(), edges = nextnum();
for(int i = 0; i < edges; i++){
int x = nextnum(), y = nextnum();
G[x].push_back(y);
}
x = 1;
int flag = 1;
while(flag){
flag = 0;
for(int i = 1; i <= n; i++)
if(!left[i])
flag = flag | src(i);
x++;
}
int cuplaj = 0;
for(int i = 1; i <= n; i++)
if(left[i]) cuplaj++;
fprintf(fo,"%d\n", cuplaj);
for(int i = 1; i <= n; i++)
if(left[i]) fprintf(fo,"%d %d\n", i, left[i]);
fclose(fi);
fclose(fo);
return 0;
}