1. 程式人生 > 其它 >P5767 [NOI1997]最優乘車 題解

P5767 [NOI1997]最優乘車 題解

題目連結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;
}