Pagini recente » Cod sursa (job #1396193) | Cod sursa (job #691004) | Cod sursa (job #3152695) | Cod sursa (job #2735878) | Cod sursa (job #2425877)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<vector<int> > Graph(10001);
int N, M, T, E, i, j, ToRight[10001], ToLeft[10001], done, Sol, k;
bool Check[10001];
int Cuplaj(int i); char C[20];
int Read();
int main()
{
freopen("java.in", "r", stdin);
freopen("java.out", "w", stdout);
fgets(C, 20, stdin); k=-1; T=Read();
while(T--){
k=-1;
fgets(C, 20, stdin);
N=Read(); M=Read(); E=Read();
for(i=1; i<=N; ++i)
Graph[i].push_back(0);
for(i=1; i<=E; ++i){
int x, y;
k=-1;
fgets(C, 20, stdin);
x=Read(); y=Read();
++Graph[x][0]; Graph[x].push_back(y);
}
do{
done=0;
for(i=1; i<=N; ++i) Check[i]=false;
for(i=1; i<=N; ++i) if(ToRight[i]==0) done|=Cuplaj(i);
} while(done!=0);
printf("%d\n", Sol);
if(T==0) continue;
for(i=1; i<=N; ++i){
Graph[i].clear();
ToRight[i]=0;
}
for(i=1; i<=M; ++i) ToLeft[i]=0; Sol=0;
}
return 0;
}
int Cuplaj(int i){
if(Check[i]==true) return 0;
Check[i]=true;
int j;
for(j=1; j<=Graph[i][0]; ++j) if(ToLeft[Graph[i][j]]==0){
ToRight[i]=Graph[i][j];
ToLeft[Graph[i][j]]=i;
++Sol;
return 1;
}
for(j=1; j<=Graph[i][0]; ++j) if(Cuplaj(ToLeft[Graph[i][j]])==1){
ToRight[i]=Graph[i][j];
ToLeft[Graph[i][j]]=i;
return 1;
}
return 0;
}
int Read(){
int nr=0; ++k;
for(; C[k]!='\n' && C[k]!=' '; ++k) nr=nr*10+(C[k]-'0');
return nr;
}