电车,洛谷之提高历练地,最短路问题

正文

      第三题:电车

      题意是,这个电车要经过n个点,但是每个点的出边可能有很多条,所以为了方便,设置了一个开关,开关默认指向出边的一号。求从一点出发,要下车多少次打开关。

      这题很容易,从x点遍历到y点时,看一下y点是不是x的一号边指向的点。如果是的话,那么就不用下车开关,否则就要下车。

      没了。分两种情况跑最短路即可。

#include
#include
#include
#include
using namespace std;

int n,a,b;
int to[110][100];
int ci[110];
queue f;
bool tf[110];

void bfs(){
	f.push(a);
	memset(ci,63,sizeof(ci));
	ci[a]=0;
	while(!f.empty()){
		int x=f.front();
		f.pop();
		tf[x]=false;
		for(int i=1;i<=to[x][0];i++){
			int y=to[x][i];
			if(y==to[x][1]){
				if(ci[y]>ci[x]) {
					ci[y]=ci[x];
					if(!tf[y]){
						tf[y]=true;
						f.push(y);
					}
				}
			}
			else {
				if(ci[y]>ci[x]+1) {
					ci[y]=ci[x]+1;
					if(!tf[y]) {
						tf[y]=true;
						f.push(y);
					}
				}
			}
		}
	}
}

int main(){
	scanf("%d %d %d",&n,&a,&b);
	for(int i=1;i<=n;i++){
		int t;
		scanf("%d",&t);
		for(int j=1;j<=t;j++)
			 scanf("%d",&to[i][j]);
		to[i][0]=t;
		to[i][t+1]=to[i][1];
	}
	bfs();
	if(ci[b]==1061109567) printf("-1");
	else printf("%d",ci[b]);
}

      

你可能感兴趣的:(电车,洛谷之提高历练地,最短路问题)