您的位置:首页 > 其它

暑期训练赛(6)A题

2014-08-05 18:04 239 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 120005;
int du1[maxn],du2[maxn];
vector<int>G[maxn];
queue<int>q1,q2;
int n,m,k;
int solve()
{
for(int i=1;i<=n;++i)
if(!du1[i])q1.push(i);
for(int i=n+1;i<=n+m;++i)
if(!du1[i])q2.push(i);
int res=1;
while(!q1.empty()||!q2.empty())
{
if(!q1.empty())++res;
while(!q1.empty())
{
int x=q1.front();
q1.pop();
for(int i=0;i<G[x].size();++i)
{
int u=G[x][i];
--du1[u];
if(!du1[u])
{
if(u>n)q2.push(u);
else q1.push(u);
}
}
}
if(!q2.empty())++res;
while(!q2.empty())
{
int x=q2.front();
q2.pop();
for(int i=0;i<G[x].size();++i)
{
int u=G[x][i];
--du1[u];
if(!du1[u])
{
if(u>n)q2.push(u);
else q1.push(u);
}
}
}
}
for(int i=1;i<=n;++i)
if(!du2[i])q1.push(i);
for(int i=n+1;i<=n+m;++i)
if(!du2[i])q2.push(i);
int ans=1;
while(!q1.empty()||!q2.empty())
{
if(!q2.empty())++ans;
while(!q2.empty())
{
int x=q2.front();
q2.pop();
for(int i=0;i<G[x].size();++i)
{
int u=G[x][i];
--du2[u];
if(!du2[u])
{
if(u>n)q2.push(u);
else q1.push(u);
}
}
}
if(!q1.empty())++ans;
while(!q1.empty())
{
int x=q1.front();
q1.pop();
for(int i=0;i<G[x].size();++i)
{
int u=G[x][i];
--du2[u];
if(!du2[u])
{
if(u>n)q2.push(u);
else q1.push(u);
}
}
}
}
return min(ans,res);
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k)&&n||m||k)
{
for(int i=1;i<=n+m;++i)
G[i].clear(),du1[i]=du2[i]=0;
while(!q1.empty())q1.pop();
while(!q2.empty())q2.pop();
for(int i=1;i<=k;++i)
{
int u,v;
scanf("%d%d",&u,&v);
G[v].push_back(u);
du1[u]++;
du2[u]++;
}
printf("%d\n",solve());
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  暑期训练赛6