您的位置:首页 > 其它

Bus Pass ZOJ 2913 BFS 最大中取最小的

2013-03-23 02:02 405 查看
/*该题的解题思路为BFS,从某点开始进行BFS,以层数表示到该地区的距离,用到了滚动队列。
对每个公交车的站点进行BFS,记录每个地区到该公交站的距离,遍历完后会得出每个地区到
所有公交站点的最大距离,以此知道选择了该地区后的星型阀值。然后从所有地区中选择一个
最小的*/

View Code

#include <cstdio>
#include <queue>
#include <cstring>
#define ZMAX 10000 //地区编号的最大值
#define INF 100000
using namespace std;
int nz,nr;  //地区的数目,公交路线的数目
int mz[ZMAX]; //mz[i] 为与第i个地区相邻的地区数目
//"邻接矩阵",edge[i][j]表示为编号为i的地区的第j个相邻地区的编号
int edge[ZMAX][10];
int res[ZMAX];  //res[i] 表示每条路线上每个地区编号为i个地区距离中的最大值
int cur;   //记录当前公交的站点次序,cur == 0表示当前是第0站
int reach[ZMAX]; //reach[s] == cur 表示地区s在第cur站已访问

int max(int x,int y)
{
return (x>y) ? x : y;
}
//从位置s出发进行BFS遍历(遍历其他所有顶点)
void BFS(int s)
{
int i ,a,b;
int val,at; //val用于记录层数,即距离;
//at用于表示BFS过程中的当前结点
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++)
{
int d = edge[at][i];
if(reach[d] < cur)
{
q[b].push(d);
reach[d] = cur;
res[d] = max(res[d],val+1);
}
}
}
}
}
int main()
{
int T; //输入文件中测试数据个数
int i,j;//循环变量
int id; //地区编号
int mr; //每条公交线路途径的地区数目
int ret,center;//最小星型阀值和取得最小星型阀值的中心地区编号
//    freopen("in.cpp","r",stdin);
scanf("%d",&T);
while(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 = INF;
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;
}


  

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