P2296 尋找道路(dfs spfa)

2021-09-19 03:03:46 字數 1664 閱讀 7275

洛谷 p2296 尋找道路

題目描述

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

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

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

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

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

輸入輸出格式

輸入格式:

第一行有兩個用乙個空格隔開的整數 nn 和 mm,表示圖有 nn 個點和 mm 條邊。

接下來的 mm 行每行 22 個整數 x,yx,y,之間用乙個空格隔開,表示有一條邊從點 xx 指向點yy。

最後一行有兩個用乙個空格隔開的整數 s, ts,t,表示起點為 ss,終點為 tt。

輸出格式:

輸出只有一行,包含乙個整數,表示滿足題目描述的最短路徑的長度。如果這樣的路徑不存在,輸出-1−1。

輸入輸出樣例

輸入樣例#1:

3 21 2

2 11 3

輸出樣例#1:

-1輸入樣例#2:

6 61 2

1 32 6

2 54 5

3 41 5

輸出樣例#2:

3分析:題目要找出路徑上的所有點的出邊所指向的點都直接或間接與終點連通。也就是說當前點有一條邊的出邊最終沒有連到終點,那麼這個點就是不合條件的,標記不能通過這個點進行鬆弛。如樣例2

因為2的一條出邊指向6,而6最終沒有指向終點5,所以與2有關的邊不能作為鬆弛的點

#includeusing namespace std;

const int n = 1e6+10;

const int inf = 0x3f3f3f3f;

struct nodeedge[n];

int n, m, cnt, st, ed;

int fir[n], x[n], y[n], dis[n];

bool vis[n], book[n], book1[n];

inline void add(int u, int v, int w);

fir[u] = cnt++;

}inline void dfs(int u)

}inline int spfa(int st)

dis[st] = 0;

queueq;

q.push(st);

while(!q.empty())

if(dis[v] > dis[u] + edge[i].w)}}

}return dis[ed];

}int main()

scanf("%d%d", &st, &ed);

dfs(ed);

memset(fir, 0, sizeof(fir));

for(int i = 0; i < m; i++)

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

int ans = spfa(st);

if(ans == inf)

printf("-1\n");

else

printf("%d\n", ans);

}return 0;

}

posted on 2018-12-12 14:31收藏

P2296 尋找道路

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

P2296 尋找道路

反著建圖,從點 include include include define ri register int using namespace std const int maxn 200020,inf 1310668019 int n,m,s,t,u maxn v maxn w maxn fst m...

P2296 尋找道路

洛谷鏈結 這個題是14年day2的第二題,也只有普及 提高的難度。題目大意就是在一堆滿足所有後繼連線的點都可以到達終點的點中,找到最短路徑。思路就是先一邊dfs,求出滿足條件1的點,之後spfa就好了,其實用bfs會更快一點。1 include2 include3 define n 10010 4 ...