題目描述
在有向圖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
1 #include2 #include3 #include4 #include5 #include6思路:先建一張反向圖,並且從終點反向bfs這時候將所有都到的點用used標記一下,然後再見一張正向圖跑一邊spfa注意跑的時候判斷一下,如果有乙個點在反向bfs的時候沒有用到,也就是used沒標記,那麼這個電是不也以用的,直接continue掉,求得dis[t]即為解using
namespace
std;
7int head[500000];8
int ct=0
,s,t;
9int used[300000],dis[300000],vis[300000
];10
int n,m,x[300000],y[300000
];11
bool
flag;
12struct
edgee[500000
];16
void add(int
from,int
to)22
bool pd(int
pos)
27return1;
28}29void
bfs()
3040}41
}42}43
void
spfa()
4457
if(v==t)58}
59}60}
61}62int
main()
69 scanf("
%d%d
",&s,&t);
70bfs();
71if(!used[s])
75 memset(head,0,sizeof(head));//
再次初始化
76 memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof
(vis));
77 ct=0;78
for(i=1;i<=m;i++)
81spfa();
82if(flag==false) printf("-1"
);83
else printf("%d"
,dis[t]);
84return0;
85 }
洛谷P2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...
洛谷 P2296 尋找道路
題目描述 在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度...
洛谷 P2296 尋找道路
題目大意 在乙個有向圖中找出2點之間的最短路,並且路徑上的所有點的出邊所指向的點都直接或間接與終點連通。題解 spfa 佇列 dfs 1.從終點方向搜,把終點能到的點標記可到達。2.把終點能到達的點的出邊判斷,如果出邊未被標記則狀態更新為不可到達。3.做spfa,若t i 可以到達就做,不然不做。v...