标签:getchar 最短路 can ret lse class tor return 枚举
首先,预处理,把每条边反向。
从终点开始bfs,标记从终点开始可以走到的点。
第二步,枚举每一个点,如果这个点没有被标记,则枚举它的每一条出边(反向后的),如果它指向的点被标记,则说明这个被标记的点不合法,删除。
第三步,在合法点上bfs,单源最短路。
#include<bits/stdc++.h> using namespace std; int read() { int x=0,y=1;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘0‘)y=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*y; } int n,m; vector<int>v[10005]; bool cando[10005],er[10005]; queue<int>q; int st,ed; int ans[10005]; int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int a=read(),b=read(); if(a==b)continue; v[b].push_back(a); } st=read(),ed=read(); cando[ed]=1; q.push(ed); while(!q.empty()) { int no=q.front(); q.pop(); for(int i=0,j=v[no].size();i<j;i++) if(!cando[v[no][i]]){cando[v[no][i]]=1;q.push(v[no][i]);} } memcpy(er,cando,sizeof(cando)); for(int i=1;i<=n;i++) if(!cando[i]) for(int j=0,k=v[i].size();j<k;j++) if(er[v[i][j]]) er[v[i][j]]=0; q.push(ed); while(!q.empty()) { int no=q.front(); q.pop(); for(int i=0,j=v[no].size();i<j;i++) if(er[v[no][i]]) { q.push(v[no][i]); er[v[no][i]]=0; ans[v[no][i]]=ans[no]+1; } } if(ans[st]==0)printf("-1"); else printf("%d",ans[st]); return 0; }
标签:getchar 最短路 can ret lse class tor return 枚举
原文地址:https://www.cnblogs.com/ainiyuling/p/11485619.html