赞
踩
H城是一个旅游胜地,每年都有成千上万的人前来观光。为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。
一名旅客最近到H城旅游,他很想去S公园游玩,但如果从他所在的饭店没有一路巴士可以直接到达S公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士, 这样换乘几次后到达S公园。
现在用整数1,2,…N 给H城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为1,S公园巴士站的编号为N。
写一个程序,帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程中换车的次数最少。
第一行有两个数字M和N(1<=M<=100 1<N<=500),表示开通了M条单程巴士线路,总共有N个车站。从第二行到第M行依次给出了第1条到第M条巴士线路的信息。其中第i+1行给出的是第i条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。
只有一行。如果无法乘巴士从饭店到达S公园,则输出"N0",否则输出你的程序所找到的最少换车次数,换车次数为0表示不需换车即可到达。
输入 复制
3 7 6 7 4 7 3 6 2 1 3 5
输出 复制
2
同一条线路上的站点,前一个站点到后面的所有站点都只需乘坐一次车。可以增补这些边。
这题用bfs来解决。
根据题目,我们可以将每个序列中出现的元素两两相连,这样就构造出了一张无向图,这个无向图的节点就是每个数字,边就是这些数字之间能够互相连通的关系。
因为序列中的每个元素都是联通的,因此可以直接在邻接矩阵中标记它们之间的连通关系,即 eg[G[i]][G[j]]=1。
对于无向图,从起点到终点的最短路径可以用广度优先搜索(bfs)算法求解。因此,我们可以使用 bfs 算法求出起点 $1$ 到终点 $n$ 的最短路径,最后输出距离即可。
- #include<bits/stdc++.h>
- using namespace std;
- const int N=505;
- struct Node
- {
- int v,d;
- Node(){}
- Node(int a,int b):v(a),d(b){}
- };
- bool vis[N];int n,eg[N][N];
- int bfs(){
- queue<Node> Q;
- vis[1]=1;Q.push(Node(1,0));
- while(Q.empty()==0)
- {
- int u=Q.front().v;int d=Q.front().d;
- Q.pop();
- if(u==n) return d;
- for(int i=1;i<=n;++i)
- {
- if(eg[u][i]&&vis[i]==0)
- {
- vis[i]=1;
- Q.push(Node(i,d+1));
- }
- }
- }
- return -1;
- }
- int main()
- {
- string s;int a,m;
- scanf("%d%d",&m,&n);getline(cin,s);
- for(int k=1;k<=m;++k){
- vector<int> G;
- getline(cin, s);
- stringstream ss(s);
- while(ss>>a) G.push_back(a);
- for(int i=0;i<G.size()-1;++i)
- for(int j=i+1;j<G.size();++j)
- eg[G[i]][G[j]]=1;
- }
- int len=bfs();
- if(len==-1) cout<<"NO";
- else printf("%d",len-1);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。