題解 洛谷P2296 尋找道路 最短路 bfs

2021-08-22 18:10:14 字數 1151 閱讀 2206

這道題理論上用bfs是可以解決的,但要判斷的條件比較多。看到資料範圍後,我決定還是用最短路來解決更加方便。

思路就是我們要處理出不能用的點,然後跑最短路時判斷如果出現這個點跳過就好了。

判斷不能用的點,我們可以從終點開始擴散,將到達的每乙個點打上標記。這樣我們就可以初步找出從起點出發進入某個點是死胡同的情況。處理出這些點後,我們再從起點出發,對每乙個打過標記的點進行操作,如果打過標記的點擴充套件出去第一層的點沒有標記,證明這個點不能用,從它出發的路有不能到達終點的情況,然後在全新的陣列裡記錄能否使用。

#include#include#include#include#includeusing namespace std;

const int maxn=10010;

const int maxm=200100;

int n,m,ex,ey,s=0,t=0,l;

int head[maxn],nnext[maxm*2],to[maxm*2],team[maxm*8];

int head1[maxn],nnext1[maxm*2],to1[maxm*2];

int team1[maxn*8];

int tot,tot1;

int dis[maxn];

bool b[maxn];

bool w[maxn];

bool pd[maxn];

void add(int x,int y)

void dfs(int x) }}

int main()

scanf("%d%d",&ex,&ey);

dfs(ey);

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

if(!flag) b[i]=true; }

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

dis[ey]=0;

team[t]=ey;

t++;

pd[ey]=true;

while(s!=t)

}} }

if(dis[ex]!=1e9) printf("%d",dis[ex]);

else printf("-1");

fclose(stdin);

fclose(stdout);

return 0;

}

題解 洛谷P2296 尋找道路

思路 反向建邊,初始化終點可以到達的點並標記,列舉沒被標記的點,把他們到達的點的標記記為0 注意要開乙個新的陣列標記,否則可能會用已修改的點繼續更新 最後求終點到起點的最短路 include include include include include using namespace std co...

洛谷P2296 尋找道路

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

洛谷 P2296 尋找道路

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