zoj 2913 Bus Pass

来源:互联网 发布:恒源祥淘宝模特是谁 编辑:程序博客网 时间:2024/05/19 16:48

//BFS经典题

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define MAX 10000#define INF 1000000using  namespace std;int nz,nr; // 地区数目,路线数目int mz[MAX];//mz[i]编号i地区相邻地区的数目int edge[MAX][10]; //edge[i][j]表示编号i地区第j个相邻地区的编号int reach[MAX]; //reach[s]==cur表示地区s在第cur+1站已访问int res[MAX];//res[i]表示每条线路上每个地区到地区i距离中的最大值int cur,mr;void BFS(int s){    int i,a,b;    int val,at;    queue<int> q[2];    a=0,b=1,val=0;    if(reach[s]<cur)    {        q[b].push(s);        reach[s]=cur;        res[s]=max(res[s],val+1);    }  while(!q[b].empty())  {      swap(a,b);      val++;      while(!q[a].empty())      {          at=q[a].front();          q[a].pop();      for(i=0; i<mz[at]; i++)      {          if(reach[edge[at][i]]<cur)          {               q[b].push(edge[at][i]);             reach[edge[at][i]]=cur;            res[edge[at][i]]=max(res[edge[at][i]],val+1);          }      }      }  }}int main(){    int T;    int i,j;    int id;    scanf("%d",&T);    while(T--)    {        cur=0;      memset(reach,-1,sizeof(reach));      memset(res,0,sizeof(res));       scanf("%d %d",&nz,&nr);      for(i=0; i<nz; i++)      {        scanf("%d",&id);        scanf("%d",&mz[id]);        for(j=0; j<mz[id]; j++) scanf("%d",&edge[id][j]);      }    for(i=0; i<nr; i++)    {        scanf("%d",&mr);        for(j=0; j<mr; j++)        {            scanf("%d",&id);            BFS(id);            cur++;        }    }    int ret=INF;    int center=-1;    for(i=0; i<10000; i++)    {        if(reach[i]==cur-1&&res[i]<ret)        {                     ret=res[i];            center=i;        }    }    printf("%d %d\n",ret,center);    }    return 0;}