Pagini recente » Cod sursa (job #3202580) | Cod sursa (job #624183) | Cod sursa (job #249029) | Borderou de evaluare (job #2012007) | Cod sursa (job #1825689)
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#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 long long nextnum(){
long long a = 0;
char c = nextch();
while((c < '0' || c > '9') && c != '-')
c = nextch();
int semn = 1;
if(c == '-'){
semn = -1;
c = nextch();
}
while('0' <= c && c <= '9'){
a = a*10+c-'0';
c = nextch();
}
return a*semn;
}
#define MAXN 10000
std::vector < int > G[1 + MAXN];
bool viz[1 + MAXN];
int left[1 + MAXN], right[1 + MAXN];
int src(int node){
if(viz[node]) return 0;
viz[node] = 1;
for(int i = 0; i < G[node].size(); i++)
if(!right[G[node][i]]){
left[node] = G[node][i];
right[G[node][i]] = node;
return 1;
}
for(int i = 0; i < G[node].size(); i++)
if(src(right[G[node][i]])){
left[node] = G[node][i];
right[G[node][i]] = 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);
}
int flag = 1;
while(flag){
flag = 0;
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= n; i++)
if(!left[i])
flag = flag | src(i);
}
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;
}