102 条题解

  • -1
    @ 2023-2-4 11:28:04
    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N = 510;
    
    int n,  m;
    int d[N];
    bool g[N][N];
    int stop[N];
    int q[N];
    
    void bfs(){
    	memset(d, 0x3f, sizeof d);  //初始化距离 
    	q[0] = 1;
    	d[1] = 0;
    	int hh = 0, tt = 0;
    	
    	while(hh <= tt){
    		int t = q[hh ++ ];
    		for(int i = 1; i <= n; i ++ ){
    			//之前我一直在迷惑为什么1~n的换乘次数会等于1~n的乘车次数-1
    			//其实道理很简单,即从x~y点的最近距离要么是1,要么是换乘次数最少的距离
    			//如果x、y在同一条线路,那最短距离肯定是1
    			//如果不在同一条线路,那最短距离就会被换乘的站点之间更新,因为一直在找最小距离
    			//所以1~n的换乘次数会等于1~n的乘车次数-1
    			if(d[i] > d[t] + 1 &amp;&amp; g[t][i]){  //如果点i和点t之间有通路且通过t可以找到到达i的更小距离 
    				d[i] = d[t] + 1;
    				q[ ++ tt] = i; 
    			}
    		}
    	}
    }
    
    int main()
    {
    	cin>>m>>n;
    	string line;
    	getline(cin, line);  //读取m、n后面的空格/换行符
    	while(m -- ){
    		getline(cin, line);  //读入一行
    		stringstream ssin(line);  //定义字符串流ssin,用line初始化ssin(相当于赋值) 
    		int cnt = 0, p;
    		while(ssin>>p) stop[cnt ++ ] = p;
    		//将同一条线路的每个站点和之后的每个站点连一条线 
    		for(int i = 0; i < cnt; i ++ ){
    			for(int j = i + 1; j < cnt; j ++ ){
    				g[stop[i]][stop[j]] = true;
    			}
    		}
    	}
    	bfs();
    	
    	if(d[n] == 0x3f3f3f3f) cout<<"NO"<<endl;
    	else cout<<max(d[n] - 1, 0)<<endl;
    	
    	return 0;
    }
    
    

    信息

    ID
    1
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    831
    已通过
    299
    上传者