uva6467

来源:互联网 发布:windows运维 书籍 编辑:程序博客网 时间:2024/06/13 13:48
#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<queue>using namespace std;#define maxe 2000#define maxn 1000struct edge{int v,next;}E[maxe+10];int head[maxn+10],e;void init(){memset(head,-1,sizeof(head));e=0;}void add_edge(int u,int v){E[e].v=v;E[e].next=head[u];head[u]=e++;}vector<int>pa[maxn+10];int k,n,m,p;queue<int>Q;int d[maxn+10];void bfs(){for(int i=1;i<=m;i++){if(pa[i].empty()){Q.push(i);d[i]=1;//cout<<i<<"d[i]"<<d[i]<<endl;}}while(!Q.empty()){int cur=Q.front();Q.pop();//cout<<"cur--"<<cur<<endl;int md=0,td=0;for(int i=0;i<pa[cur].size();i++){int cp=pa[cur][i];if(d[cp]==md)td++;else if(d[cp]>md){td=0;md=d[cp];}d[cur]=td?md+1:md;}for(int i=head[cur];i!=-1;i=E[i].next){int v=E[i].v;//cout<<"cur_>v"<<cur<<" "<<v<<endl;Q.push(v);}}}int main(){//freopen("in.txt","r",stdin);scanf("%d",&k);for(int t=1;t<=k;t++){init();scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=m;i++)pa[i].clear();for(int i=0;i<p;i++){int u,v;scanf("%d%d",&u,&v);add_edge(u,v);pa[v].push_back(u);}memset(d,0,sizeof(0));bfs();int ans=0;for(int i=1;i<=m;i++){ans=max(ans,d[i]);//cout<<d[i]<<" ";}cout<<n<<" "<<ans<<endl;}return 0;}

0 0