洛谷【P1346】電車

先貼上鍊接:點擊打開

題目描述

在一個神奇的小鎮上有着一個特別的電車網絡,它由一些路口和軌道組成,每個路口都連接着若干個軌道,每個軌道都通向一個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有一個開關決定着出去的軌道,每個開關都有一個默認的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另一個軌道,他就必須下車切換開關的狀態。

爲了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫一個程序,計算一輛從路口A到路口B最少需要下車切換幾次開關。

輸入輸出格式

輸入格式:

第一行有3個整數2<=N<=100,1<=A,B<=N,分別表示路口的數量,和電車的起點,終點。

接下來有N行,每行的開頭有一個數字Ki(0<=Ki<=N-1),表示這個路口與Ki條軌道相連,接下來有Ki個數字表示每條軌道所通向的路口,開關默認指向第一個數字表示的軌道。

輸出格式:

輸出文件只有一個數字,表示從A到B所需的最少的切換開關次數,若無法從A前往B,輸出-1。

輸入樣例:

3 2 1
2 2 3
2 3 1
2 1 2

輸出:

0

這道題就是一道模板題嘛……這這這……主要是想記錄默認狀態和切換狀態的存儲方式

建一個圖,

把從這個車站到默認到達的那個車站的這條邊的權值設爲0,需要切換狀態的設爲1,最後拿最短路徑算法跑一次

輸出結果就OK(親測無坑)

我使用的是Floyd…………

傳送門:Floyd:點擊打開

#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 666666
using namespace std;
int g[1000][1000];
int n,m,k,f,t;
int main()
{
    scanf("%d%d%d",&n,&f,&t);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
    g[i][j]=i==j?0:INF;} 
    for(int i=1;i<=n;i++){
    scanf("%d",&k);
    for(int j=1;j<=k;j++){
    int a;
    scanf("%d",&a);
    if(j==1)g[i][a]=0;
    else g[i][a]=1;
    }
    }
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    if(g[f][t]==INF)puts("-1");
    else printf("%d",g[f][t]);
}
END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章