点击打开链接
// main.cpp
// test
//
// Created by 吴有堃 on 2017/9/11.
// Copyright © 2017年 吴有堃. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <vector>
#define LL long long
#define inf 0x3f3f3f3f
#define mod 1e9+7
using namespace std;
const int maxn=1e5+5;
int N1=0,N2=0,D=0,d[maxn],d1[maxn];
vector<int>G[maxn];
queue<int>Q[2];
int ans=0;
int Topsort(int flag)
{
ans=0;
while (!Q[0].empty()) Q[0].pop();
while (!Q[1].empty()) Q[1].pop();
int las=N1+N2;
for(int i=1;i<=las;i++){
if(d[i]==0){
if(i<=N1) Q[0].push(i);
else Q[1].push(i);
}
}
int i=0,u=0,v=0;
while (!Q[flag].empty() || !Q[flag^1].empty()) {
while (!Q[flag].empty()) {
u=Q[flag].front(); Q[flag].pop();
for(i=0;i<G[u].size();i++){
v=G[u][i];
d[v]-=1;
if(d[v]==0){
if(v<=N1) Q[0].push(v);
else Q[1].push(v);
}
}
}
flag=flag^1;
ans+=1;
}
return ans;
}
int main()
{
int x=0,y=0,las=0;
while (scanf("%d %d %d",&N1,&N2,&D)) {
if(N1==0&&N2==0&&D==0) break;
memset(d,0,sizeof(d));
memset(d1,0,sizeof(d1));
for(int i=0;i<maxn;i++)G[i].clear();
for(int i=0;i<D;i++){
scanf("%d %d",&x,&y);
G[y].push_back(x);
d[x]+=1;d1[x]+=1;
}
las=N1+N2;
for(int i=1;i<=las;i++) d[i]=d1[i];
int resul1=Topsort(0);//算左边盘子
for(int i=1;i<=las;i++) d[i]=d1[i];
int resut2=Topsort(1);//算右边盘子
int result=min(resul1,resut2);
printf("%d\n",result+1);
}
return 0;
}