UOJ 19 [NOIP2014]寻找道路
2016-08-29 18:12
357 查看
图的遍历+最短路。
第一眼看,好难,不会做。
仔细一看,发现只要一次反向边BFS把不合题意的点全部丢掉就可以直接跑最短路了- -
顺利打完之后被hack成97分,原因是没有判断起点直接不可取的情况。改后AC。
第一眼看,好难,不会做。
仔细一看,发现只要一次反向边BFS把不合题意的点全部丢掉就可以直接跑最短路了- -
顺利打完之后被hack成97分,原因是没有判断起点直接不可取的情况。改后AC。
#include<cstdio> #include<queue> #include<cstring> #define N 10005 #define M 200005 using namespace std; struct edge{int next,to;}e[M<<1]; int cnt=0, last[2] , n, m, s, t, d ; bool vis , ban , inq ; void add(int i, int a, int b) { e[++cnt]=(edge){last[i][a],b}; last[i][a]=cnt; } void bfs(int beg) { queue<int> q; q.push(beg); vis[beg]=1; while(!q.empty()) { int x=q.front(); q.pop(); for(int i = last[1][x]; i; i=e[i].next) { int y=e[i].to; if(vis[y])continue; vis[y]=1; q.push(y); } } } void solve() { for(int i = 1; i <= n; i++) if(!vis[i]) for(int j = last[1][i]; j; j=e[j].next) ban[e[j].to]=1; } int SPFA(int beg, int end) { if(ban[beg])return -1; memset(d,63,sizeof(d)); queue<int> q; q.push(beg); d[beg]=0; while(!q.empty()) { int x=q.front(); q.pop(); inq[x]=0; for(int i = last[0][x]; i; i=e[i].next) { int y=e[i].to; if(ban[y] || d[x]+1>=d[y])continue; d[y]=d[x]+1; if(!inq[y]) { inq[y]=1; q.push(y); } } } return d[end]; } int main() { scanf("%d%d",&n,&m); for(int a, b, i = 1; i <= m; i++) { scanf("%d%d",&a,&b); add(0,a,b); add(1,b,a); } scanf("%d%d",&s,&t); bfs(t); solve(); int ans = SPFA(s, t); printf("%d\n",ans>N?-1:ans); }
相关文章推荐
- SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载
- Linux文档编辑器的使用
- 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链
- 使用js实现显示系统当前时间并实现倒计时功能并触发模态框(遮罩)功能
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
- ajax如何解决跨域问题
- hive安装 (hive1.2.1+hadoop2.7+mysql)
- 多层嵌套的使用要点及优化
- Android studio常用快捷键
- Caffe的卷积原理
- CentOS6 PHP5.6+Nginx Docker镜像制作
- Android动画使用(一)
- HDU 3308 LCIS
- “0d 0a”这两个字符是什么涵义
- Unity3d游戏开发框架-UI管理类 UIManager
- 【英语】八月,英语行云流水
- malloc、calloc、realloc的区别
- mysql常用的hint
- C# IIS7.0+ Web.Config 配置Session过期时间
- Web干货存档