1. 程式人生 > >P1346 電車 dijkstra變形+堆優化

P1346 電車 dijkstra變形+堆優化

開始時間:10.10 19:52

ac時間:10.10 20:12

題目描述

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

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

輸入輸出格式

輸入格式:

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 複製

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

輸出樣例#1: 複製

0
 

djikstra的變形,我們需要找出到終點的最小次數,將原來的dis陣列變成times來記錄到達每個點所需的最小改變次數,列舉每個點不斷更新最小值即可

其實資料很小不用優化應該也能a,但是寫習慣了嗚

#include <iostream>

#include <queue>

#include <map>

#include <string>

#include <cmath>

#include <cstdio>

#include <string.h>

#include <set>

#include <cstring>

#include <cstdio>

#include <algorithm>

#include <sstream>

#include <list>

#include <iomanip>

#include <stack>

#include <vector>

using namespace std;

//#define eps 1e-9

#define inf 0x3fffffff

//#define pi acos(-1.0)

#define pi 3.1415927

#define Abs(x) (x>0?x:(-x))

#define Max(a,b) (a>b?a:b)

#define Min(a,b) (a<b?a:b)

#define ll long long

//以下是正式程式碼

int n,a,b;

const int maxn=105;

int vis[maxn];

int times[maxn];

vector<int> bian[maxn];

struct cmp

{    bool operator()(int &a,int &b)

    {

        return times[a]>times[b];

    }

};

void dij(int s)

{

    memset(vis, 0, sizeof(vis));

    fill(times,times+maxn,inf);

    priority_queue<int,vector<int>,cmp> q;

    q.push(s);

    times[s]=0;

    while (!q.empty())

    {

        int now=q.top();

        q.pop();

        if(vis[now]) continue;

        for(int i=0;i<bian[now].size();i++)

        {

            int to=bian[now][i];

            if(vis[to]) continue;

            if(i==0&&times[now]<times[to])

            {

                times[to]=times[now];

                q.push(to);

            }

            if(i!=0&&times[now]+1<times[to])

            {

                times[to]=times[now]+1;

                q.push(to);

            }

        }

    }

}

int main()

{

    int k,x;

    scanf("%d%d%d",&n,&a,&b);

    for(int i=1;i<=n;i++)

    {

        scanf("%d",&k);

        while(k--)

        {

            scanf("%d",&x);

            if(x!=i)

            bian[i].push_back(x);

        }

    }

    dij(a);

    if(times[b]==inf) printf("-1");

    else printf("%d",times[b]);

}