P5767 [NOI1997]最優乘車 題解
阿新 • • 發佈:2022-04-21
題目連結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; }