[noip2014]寻找道路 题解
2017-10-24 22:53
471 查看
emmmm,按照题意来做就好了。
首先,我们反向建边,从终点开始搜索,看能到哪儿些点,记录一下,再正向建边,看有哪儿些点连了这些点,把它们都排除就好了。
剩下的就是裸的最短路了。
首先,我们反向建边,从终点开始搜索,看能到哪儿些点,记录一下,再正向建边,看有哪儿些点连了这些点,把它们都排除就好了。
剩下的就是裸的最短路了。
#include<bits/stdc++.h> #define N 10000 #define M 200000 using namespace std; int n,m,s,t,inf; int x[M+5],y[M+5]; int first[N+5],nxt[M+5],to[M+5],siz; int vis[N+5],dis[N+5]; int Q[N+5],l,r,in[N+5]; inline void add(int x,int y) { nxt[siz]=first[x]; first[x]=siz; to[siz]=y; siz++; } inline void DFS(int x) { vis[x]=true; for(int i=first[x];i!=-1;i=nxt[i]) { int u=to[i]; if(!vis[u])DFS(u); } } inline void SPFA(int s) { memset(dis,63,sizeof(dis)); inf=dis[s],dis[s]=0,Q[1]=s,l=0,r=1,in[s]=true; if(vis[s]!=1)return; while(l<r) { int x=Q[++l];in[x]=false; for(int i=first[x];i!=-1;i=nxt[i]) { int u=to[i]; if(vis[u]!=1)continue; if(dis[x]+1<dis[u]) { dis[u]=dis[x]+1; if(in[u])continue; in[u]=true;Q[++r]=u; } } } } int main() { freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); for(int i=1;i<=m;i++)scanf("%d%d",&x[i],&y[i]); scanf("%d%d",&s,&t); for(int i=1;i<=m;i++)add(y[i],x[i]); DFS(t); memset(first,-1,sizeof(first)),siz=0; for(int i=1;i<=m;i++)add(x[i],y[i]); for(int i=1;i<=n;i++) for(int j=first[i];j!=-1;j=nxt[j]) if(!vis[to[j]])vis[i]=2; SPFA(s); cout<<(dis[t]==inf?-1:dis[t]); return 0; }
相关文章推荐
- [NOIP2014]寻找道路 题解
- Noip 2014 提高组 寻找道路
- [NOIP2014]寻找道路 D2 T2
- [NOIP2014][建图]寻找道路
- 洛谷 P2296 [NOIP2014 D2T2] 寻找道路
- NOIp2014提高组 寻找道路->蜜汁最短路
- 【NOIP2014】D2T2 寻找道路
- 【题解】NOIP-2014 寻找道路
- NOIP2014 寻找道路 解题报告(dfs+bfs)
- vijos1909【noip2014】寻找道路
- NOIP 2014 - 提高组 寻找道路
- 【NOIP2014提高组T5】寻找道路-双spfa
- [noip2014tg] 寻找道路
- NOIP2014 day2 t2 寻找道路
- NOIP2014 Day2T2 寻找道路 bfs
- 【noip2014】tyvj4058 寻找道路
- 【NOIP2014】UOJ #19 CODE[VS] 3731 寻找道路 反向建图+SPFA
- NOIP2014 day2 t2 寻找道路
- [NOIP2014] 提高组 洛谷P2296 寻找道路
- {题解}[jzoj3806]【NOIP2014模拟8.24】小X 的道路修建