題目大意:
薩格勒布的電車網路由許多交叉路口和連線其中一些的鐵路組成。在每個交叉路口都有乙個開關,指向從交叉路口出來的一條鐵軌。當有軌電車進入交叉路口時,它只能沿開關指向的方向離開。如果駕駛員想要採取其他方式,他/她必須手動更換開關。
當駕駛員從交叉路口a到交叉路口b進行駕駛時,他/她試圖選擇將最小化他/她必須手動更換開關的次數的路線。
編寫乙個程式,計算從交叉路口 a
aa 到交叉路口 b
bb 所需的最小開關變化次數。
輸入輸入的第一行包含整數 n
nn,a
aa 和 b
bb,由單個空白字元分隔,2≤n
≤100,1
≤a,b
≤n,n
2 \le n \le 100,1 \le a,b \le n,n
2≤n≤10
0,1≤
a,b≤
n,n 是網路中的交叉點數,以及交叉點從 1
11 到 n
nn 編號。
以下 n
nn 行中的每一行包含由單個空白字元分隔的整數序列。第 i
ii 行中的第乙個數字 ki(
0≤ki
≤n−1
)k_i(0 \le k_i \le n-1)
ki(0≤
ki≤
n−1)
表示從第i個交叉點出來的軌道數。下乙個 k
ik_i
ki 數字表示直接連線到第i個交叉點的交叉點。第i個交叉點中的交換點最初指向列出的第乙個交叉點的方向。
產量輸出的第一行也是唯一一行應包含目標最小數。如果沒有從 a
aa 到 b
bb 的路由,則該行應包含整數 −1-1
−1。樣本輸入
321
2232
3121
2
樣本輸出
0
翻譯可能不準確,是谷歌的
自己初中水平有限,請多多包涵
題意分析
\tt \text
題意分析
首先,電車的軌道就相當於一張圖輸入輸出的分析不妨我們將不用轉動的當做0,需要轉動的當做1(每個開關就相當於一條無向邊)
由此我們就可以將本題轉換為圖論最短路
每一行的第乙個數代表和它相連的點關於**第乙個點就先標記為0,其他為1
時間限制不嚴格各種方式都可以通過此為通過的截圖
這種題可以用floyd 因為真的簡單
for
(int k=
1;k<=n;k++
)for
(int u=
1;u<=n;u++
)for
(int v=
1;v<=n;v++
)
這是一種 o(vspfa3)o(v^3)
o(v3
) 的複雜度,比賽時不推薦,但是注意第乙個迴圈本質上就是考慮走了幾條邊,這個是很有用的性質。
\text
spfa
這是 o(k**e)o(ke)
o(ke
) 的複雜度,顯然在現在已經假了
#
include
//#include
#include
#include
#include
using
namespace std;
struct
edg;
const
int inf=
0x3f3f3f3f
;vector edg[
205]
;int dist[
105]
;int vis[
205]
;int
main()
);for(
int j=
2;j<=x;j++))
;}} queue<
int> q;
q.push
(a);
for(
int i=
1;i<=n;i++
) dist[i]
=inf;
dist[a]=0
; vis[a]
=true
;while
(!q.
empty()
)}}}
if(dist[b]
==inf)
printf
("-1\n");
else
printf
("%d\n"
,dist[b]);
}return0;
}
注意:不要忘記判斷無解的情況。
謝謝您的**
關於題的分析
看下面的 分析結果 public class transfertest3 public void first public void second value v,int i class value 先給出答案 15 0 20為什麼呢?這個問題主要糾結在最後的這個20上 public void fi...
關於樹的程式設計題
public boolean issametree treenode tree1,treenode tree2 else if tree1 null tree2 null if tree1 null tree2 null else return false 原文 二叉樹的映象 public void...
關於陣列的演算法題
1.當陣列中包含負數時,返回該陣列的最大連續子串行的和。例如 6,3,2,7,15,1,2,2 其連續子串行的最大和是8 從第0個開始,到第3個為止 子串行的長度至少為1。class solution def sum arr self,array sum 0 max 0 for data in ar...