題目提供者該使用者不存在
標籤圖論2014noip提高組
難度普及+/提高
提交該題 討論
題解記錄
在有向圖g 中,每條邊的長度均為1 ,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件:
1 .路徑上的所有點的出邊所指向的點都直接或間接與終點連通。
2 .在滿足條件1 的情況下使路徑最短。
注意:圖g 中可能存在重邊和自環,題目保證終點沒有出邊。
請你輸出符合條件的路徑的長度。
輸入格式:
輸入檔名為road .in。
第一行有兩個用乙個空格隔開的整數n 和m ,表示圖有n 個點和m 條邊。
接下來的m 行每行2 個整數x 、y ,之間用乙個空格隔開,表示有一條邊從點x 指向點y 。
最後一行有兩個用乙個空格隔開的整數s 、t ,表示起點為s ,終點為t 。
輸出格式:
輸出檔名為road .out 。
輸出只有一行,包含乙個整數,表示滿足題目᧿述的最短路徑的長度。如果這樣的路徑不存在,輸出- 1 。
輸入樣例#1:
3 2輸出樣例#1:1 2
2 1
1 3
-1輸入樣例#2:
6 6輸出樣例#2:1 2
1 3
2 6
2 5
4 5
3 4
1 5
3解釋1:
如上圖所示,箭頭表示有向道路,圓點表示城市。起點1 與終點3 不連通,所以滿足題
目᧿述的路徑不存在,故輸出- 1 。
解釋2:
如上圖所示,滿足條件的路徑為1 - >3- >4- >5。注意點2 不能在答案路徑中,因為點2連了一條邊到點6 ,而點6 不與終點5 連通。
對於30%的資料,0對於60%的資料,0對於100%的資料,0吐槽:把出邊看漏了,然後就一直wa,把tot忘了清0,i=next[i]寫成了i++,一直re......
分析:首先,怎麼知道乙個點i是否與終點連通呢?可以floyd,但是對於這道題就不需要了,從終點反向一次bfs,能標記到的點就是能訪問到的,因為邊權為1,求最短路從起點再來一次bfs即可.每次擴充套件之前都要先判斷出邊有沒有被標記,從終點bfs了一次過後一定要將用過的陣列清0.
#include #include#include
#include
using
namespace
std;
const
int maxn = 10010, maxm = 200010
;int n, m,first,tail,x[maxm],y[maxm],nextt[maxm * 2],to[maxm * 2
],head[maxm],tot,s,t,q[maxn],step[maxn];
bool
vis[maxn];
void add(int a, int
b)void
bfs1()}}
}bool chubian(int
q)bool
bfs2()}}
}return
false;}
intmain()
scanf(
"%d%d
", &s,&t);
bfs1();
memset(head,
0, sizeof
(head));
memset(step, -1, sizeof
(step));
memset(q,
0, sizeof
(q));
memset(nextt,
0, sizeof
(nextt));
memset(to,
0, sizeof
(to));
tot = 0
;
for (int i = 1; i <= m; i++)
add(x[i], y[i]);
if (!vis[s])
if (!bfs2())
printf(
"-1\n");
return0;
}
NOIP2014 尋找道路
題目描述 在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1的情況下使路徑最短。注意 圖g中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入...
NOIP2014 尋找道路
傳送門 這道題還是比較簡單的。我們只要先用老套路建出反圖,記錄終點與哪些點是聯通的,之後從所有不與終點聯通的點出發,在反圖上列舉一下與之直接相連的邊,也設為不能走。之後我們在可以走的路上跑最短路即可。看一下 include include include include include includ...
NOIP2014 尋找道路
一張有向圖 長度均為1 輸入格式為x y 表示x和y之間有一條路 給定s和t 求s到t的最短路 要求 路徑上的所有點的出邊所指向的點都直接或間接與終點連通 在這裡點包括3種 1 自己指向的節點都可以到達終點 2 自己可以到達終點的點 3 普通的點 顯然 3包括2 2包括1 這裡要的是由1組成的最短路...