這道題理論上用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 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度...