zoj 2913 Bus Pass

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2913

解题思路:BFS搜索

  1 ///////////////////////////////////////////////////////////////////////////
  2 //problem_id: zoj 2913
  3 //user_id: SCNU20102200088
  4 ///////////////////////////////////////////////////////////////////////////
  5 
  6 #include <algorithm>
  7 #include <iostream>
  8 #include <iterator>
  9 #include <iomanip>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <string>
 13 #include <vector>
 14 #include <cstdio>
 15 #include <cctype>
 16 #include <cmath>
 17 #include <queue>
 18 #include <stack>
 19 #include <list>
 20 #include <set>
 21 #include <map>
 22 using namespace std;
 23 
 24 ///////////////////////////////////////////////////////////////////////////
 25 typedef long long LL;
 26 const double PI=acos(-1.0);
 27 
 28 const int x4[]={-1,0,1,0};
 29 const int y4[]={0,1,0,-1};
 30 const int x8[]={-1,-1,0,1,1,1,0,-1};
 31 const int y8[]={0,1,1,1,0,-1,-1,-1};
 32 
 33 typedef int T;
 34 T max(T a,T b){ return a>b? a:b; }
 35 T min(T a,T b){ return a<b? a:b; }
 36 ///////////////////////////////////////////////////////////////////////////
 37 
 38 ///////////////////////////////////////////////////////////////////////////
 39 //Add Code:
 40 const int INF=1000000;
 41 int nz,id[10005],mz[10005],Min[10005],Max[10005],edge[10005][15];
 42 bool flag[10005];
 43 
 44 struct Node{
 45     int id,step;
 46     Node(int i,int s):id(i),step(s){}
 47 };
 48 
 49 void BFS(int i){
 50     int j,k,num;
 51     queue<Node> q;
 52     flag[i]=1,Min[i]=1;
 53     Node node(i,1);
 54     q.push(node);
 55     while(!q.empty()){
 56         Node temp=q.front();
 57         q.pop();
 58         k=temp.id,num=temp.step;
 59         for(j=1;j<=mz[k];j++){
 60             if(!flag[edge[k][j]]){
 61                 flag[edge[k][j]]=1,Min[edge[k][j]]=num+1;
 62                 Node res(edge[k][j],num+1);
 63                 q.push(res);
 64             }
 65         }
 66     }
 67     for(j=1;j<=nz;j++){
 68         if(Max[id[j]]==INF) Max[id[j]]=Min[id[j]];
 69         else Max[id[j]]=max(Max[id[j]],Min[id[j]]);
 70     }
 71 }
 72 ///////////////////////////////////////////////////////////////////////////
 73 
 74 int main(){
 75     ///////////////////////////////////////////////////////////////////////
 76     //Add code:
 77     int T,nr,mr,i,j,t,k;
 78     scanf("%d",&T);
 79     while(T--){
 80         scanf("%d%d",&nz,&nr);
 81         for(i=1;i<=nz;i++){
 82             scanf("%d",&id[i]);
 83             scanf("%d",&mz[id[i]]);
 84             for(j=1;j<=mz[id[i]];j++) scanf("%d",&edge[id[i]][j]);
 85             Max[id[i]]=INF;
 86         }
 87         for(i=1;i<=nr;i++){
 88             scanf("%d",&mr);
 89             for(j=1;j<=mr;j++){
 90                 scanf("%d",&k);
 91                 for(t=1;t<=nz;t++){
 92                     flag[id[t]]=0;
 93                     Min[id[t]]=0;
 94                 }
 95                 BFS(k);
 96             }
 97         }
 98         int MIN=INF+1,center;
 99         for(i=1;i<=nz;i++){
100             if(Max[id[i]]<MIN || (Max[id[i]]==MIN && id[i]<center)){
101                 MIN=Max[id[i]];
102                 center=id[i];
103             }
104         }
105         printf("%d %d\n",MIN,center);
106     }
107     ///////////////////////////////////////////////////////////////////////
108     return 0;
109 }
110 
111 ///////////////////////////////////////////////////////////////////////////
112 /*
113 Testcase:
114 Input:
115 1
116 17 2
117 7400 6 7401 7402 7403 7404 7405 7406
118 7401 6 7412 7402 7400 7406 7410 7411
119 7402 5 7412 7403 7400 7401 7411
120 7403 6 7413 7414 7404 7400 7402 7412
121 7404 5 7403 7414 7415 7405 7400
122 7405 6 7404 7415 7407 7408 7406 7400
123 7406 7 7400 7405 7407 7408 7409 7410 7401
124 7407 4 7408 7406 7405 7415
125 7408 4 7409 7406 7405 7407
126 7409 3 7410 7406 7408
127 7410 4 7411 7401 7406 7409
128 7411 5 7416 7412 7402 7401 7410
129 7412 6 7416 7411 7401 7402 7403 7413
130 7413 3 7412 7403 7414
131 7414 3 7413 7403 7404
132 7415 3 7404 7405 7407
133 7416 2 7411 7412
134 5 7409 7408 7407 7405 7415
135 6 7415 7404 7414 7413 7412 7416
136 Output:
137 4 7400
138 */
139 ///////////////////////////////////////////////////////////////////////////

posted on 2013-08-21 19:56  SCNU20102200088  阅读(221)  评论(0编辑  收藏  举报

导航