cunzai_zsy0531

关注我

P5767 [NOI1997]最优乘车 题解

Post time: 2020-02-01 18:37:49

题目链接Link

一道简单图论题,主要难点在于建图。

我们把同一条线路上的所有车站之间全部连一条边,这样就可以直接利用bfs求得最短距离,因为bfs只要到达终点就一定是最短的。

点击查看代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=500+21;
int g[N][N],a[N];//因为数据范围较小所以可以直接使用邻接矩阵 
struct node{int u,dep;}q[N];
bool vis[N];
int n,m;
int bfs(int s){
	memset(vis,0,sizeof(vis));//初始化是好习惯 
	q[0]=(node){s,0};
	vis[s]=1;
	int head=0,tail=1;//head头指针,tail尾后指针,这样比较好写。 
	while(head<tail){
		node p=q[head++];
		if(p.u==n)return p.dep-1;
		int u=p.u;
		for(int v=1;v<=n;v++){
			if(g[u][v]&&vis[v]==0){
				q[tail++]=(node){v,p.dep+1};
				vis[v]=1;
			}
		}
	}
	return -1;
}
int main(){
	scanf("%d%d",&m,&n);
	for(int p=1;p<=m;++p){
		int cnt=0;
		scanf("%d",&a[++cnt]);
		char ch=getchar();//读入需要注意 
		while(ch==' '){
			scanf("%d",&a[++cnt]);
			ch=getchar();
		}
		for(int i=1;i<=cnt;i++)
			for(int j=i+1;j<=cnt;j++)g[a[i]][a[j]]=1;
	}
	int ans=bfs(1);
	if(ans==-1)cout<<"NO"<<endl;
	else cout<<ans<<endl;
	return 0;
}
posted @ 2022-04-21 11:57  cunzai_zsy0531  阅读(47)  评论(0编辑  收藏  举报