Pagini recente » Cod sursa (job #906894) | Cod sursa (job #2167138) | Cod sursa (job #2552110) | Cod sursa (job #118687) | Cod sursa (job #1604394)
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 10023
#define EMAX 200023
#define DIM 10000
using namespace std;
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
numar = 0;
while (buff[poz] < '0' || buff[poz] > '9')
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
}
int t,n,m,e;
vector<int>adj[NMAX];
int l[NMAX],r[NMAX];
bool u[NMAX];
struct str
{
int x;
int y;
}vec[EMAX];
int comp(str a,str b)
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
int cuplaj(int nod)
{
if(u[nod]) return 0;
u[nod]=1;
int mar=adj[nod].size();
for(int i=0;i<mar;i++)
{
if(r[adj[nod][i]]==0)
{
r[adj[nod][i]]=nod;
l[nod]=adj[nod][i];
return 1;
}
}
for(int i=0;i<mar;i++)
{
if(cuplaj(r[adj[nod][i]]))
{
r[adj[nod][i]]=nod;
l[nod]=adj[nod][i];
return 1;
}
}
return 0;
}
int main()
{
freopen ("java.in","r",stdin);
freopen ("java.out","w",stdout);
citeste(t);
for(int xyz=1;xyz<=t;xyz++)
{
citeste(n),citeste(m),citeste(e);
for(int i=1;i<=e;i++) citeste(vec[i].x),citeste(vec[i].y);
sort(vec+1,vec+e+1,comp);
for(int i=1;i<=e;i++)
{
if(vec[i].x!=vec[i-1].x||vec[i].y!=vec[i-1].y) adj[vec[i].x].push_back(vec[i].y);
vec[i].x=0;
vec[i].y=0;
}
for(int c=1;c!=0;)
{
c=0;
for(int i=1;i<=n;i++)
{
if(l[i]==0) c|=cuplaj(i);
}
for(int i=1;i<=n;i++) u[i]=0;
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(l[i]!=0) sum++;
l[i]=0;
u[i]=0;
while(!adj[i].empty()) adj[i].pop_back();
}
for(int i=1;i<=m;i++) r[i]=0;
printf("%d\n",sum);
}
}