NOIP2014 選擇道路

2022-05-15 07:46:30 字數 1798 閱讀 2619

這題值得記錄。

在有向圖 ggg 中,每條邊的長度均為 1 ,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件:

路徑上的所有點的出邊所指向的點都直接或間接與終點連通。

在滿足條件 1 的情況下使路徑最短。

注意:圖 ggg 中可能存在重邊和自環,題目保證終點沒有出邊。

請你輸出符合條件的路徑的長度。

***具體題面請看

題解

我的思路是存圖的時候另開陣列反向存邊,然後在反向存邊的圖中用dfs將從終點出發能走到的點標記為1,然後一遍for迴圈,列舉標記為1的點的出邊所到的點,如果出邊所到的點中有標記為0的點,就說明當前點是不符合題目要求1的。

注意:但是我們在這裡不能直接刪去這個點,如果刪去的話,會改變圖的形態從而刪去更多的點。(我就這裡改了乙個中午...)

所以我們再開個陣列記錄哪些點要刪去,後統一刪去即可,最後跑一遍spfa。

錯誤刪點方式:

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

}}

正確刪點方式:

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

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

**

#include#include

#include

#include

#define ll long long int

using

namespace

std;

int judge[10008

];int n,m,num,cnt,q[50005],pd[10005],head[10005],head[10005],num,s,t,flag[10005],ans[10005

];struct

edgeedge[

200005

];struct

edgeroad[

200005

];void add(int u,int

v)void add(int u,int

v)void dfs(int

pos)

}}void

spfa()}}

}}int

main()

scanf(

"%d%d

",&s,&t);

flag[t]=1

; dfs(t);

if(!flag[s])

for(int i=head[s];i;i=edge[i].next)

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

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

spfa();

if(ans[t]==0x3f3f3f3f

) printf("-1

");else

printf("%d

",ans[t]);

return0;

}

我的**還是比較長的,網上還有一些bfs+dfs的做法**賊短...

NOIP2014 尋找道路

題目描述 在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1的情況下使路徑最短。注意 圖g中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入...

noip2014 尋找道路

題目提供者該使用者不存在 標籤圖論2014noip提高組 難度普及 提高 提交該題 討論 題解記錄 在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑...

NOIP2014 尋找道路

傳送門 這道題還是比較簡單的。我們只要先用老套路建出反圖,記錄終點與哪些點是聯通的,之後從所有不與終點聯通的點出發,在反圖上列舉一下與之直接相連的邊,也設為不能走。之後我們在可以走的路上跑最短路即可。看一下 include include include include include includ...