zl程序教程

您现在的位置是:首页 >  其他

当前栏目

zoj 2913 BFS

2023-03-14 10:17:52 时间
//zoj 2913 BFS
// 从每条线路上的每个地区出发进行BFS遍历,
// 统计每条线路上每个地区到其他地区最短距离中的最大值,求出所有最大值中的最小值。
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
#define MAX 10000
#define INF 100000
int nz,nr,cur;
int mz[MAX];
int Edge[MAX][10];
int res[MAX],reach[MAX];
void bfs(int s)
{
    int i,a,b,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()
{
   //freopen("input.txt","r",stdin);
    int T,i,j,t,id,mr,ret,center;
    scanf("%d",&T);
    for(t=0;t<T;t++)
    {
        memset(reach,-1,sizeof(reach));
        memset(res,0,sizeof(res));
        cur=0;
        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++;
            }
        }
        ret=MAX,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;
}