Bus Pass ZOJ 2913 BFS 最大中取最小的
2013-03-23 02:02
405 查看
/*该题的解题思路为BFS,从某点开始进行BFS,以层数表示到该地区的距离,用到了滚动队列。
对每个公交车的站点进行BFS,记录每个地区到该公交站的距离,遍历完后会得出每个地区到
所有公交站点的最大距离,以此知道选择了该地区后的星型阀值。然后从所有地区中选择一个
最小的*/
View Code
对每个公交车的站点进行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; }
相关文章推荐
- Zoj 2913 Bus Pass BFS
- zoj 3165 (最小割,最大点权独立集)
- zoj 2913 Bus Pass(BFS)
- ZOJ3362 Beer Problem,有重边的最大流最小费用
- ZOJ 3764 - ZOJ Monthly, March 2014 最大流最小割
- ZOJ 3792 Romantic Value(最小割,最大流)
- 9-17 (水BFS,e24高精度, 最大流最小割, 思路T,卡AC自动机)
- ZOJ 1952( Dijkstra )要求卡车的最大载货量,即是求dist[]的最小值这里关键是把字符串转化为数字存储在邻接矩阵cost[][]中.开始看了党姐的代码不懂,又看了一遍,大悟!
- ZOJ 3760 - Treasure Hunting(网络流‘最小割’最大点权独立集)
- ZOJ 2913 BFS
- [查找最大最小]ZOJ 2970 Faster, Higher, Stronger
- The Great Wall I (zoj 3475 最小割最大流)
- ZOJ 2913 : Bus Pass - BFS
- zoj 2532 Internship 找出关键割边(当增加其容量后使最大流增大) 最小割+dfs
- ZOJ 2913 Bus Pass(BFS+滚动队列)
- ZOJ 2913 Bus Pass(BFS+滚动队列)
- zoj3792--Romantic Value(最大流+最小割,求解割边)
- zoj2913 Bus Pass BFS
- ZOJ 1364 Machine Schedule (POJ 1325) (最小点覆盖数==最大匹配数)
- zoj 3165 (最小割,最大点权独立集)