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;
}