noip2014 寻找道路 (两次逆向宽搜)
2015-11-01 15:10
375 查看
P1909寻找道路
Accepted
标签:图结构NOIP提高组2014
在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件:
路径上的所有点的出边所指向的点都直接或间接与终点连通。
在满足条件 1 的情况下使路径最短。
注意:图 G 中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。
接下来的 m 行每行 2 个整数 x、y,之间用一个空格隔开,表示有一条边从点 x 指向点y。
最后一行有两个用一个空格隔开的整数 s、t,表示起点为 s,终点为 t。
如果这样的路径不存在,输出-1。
样例输入1[复制]
样例输出1[复制]
样例输入2[复制]
样例输出2[复制]
对于 30%的数据,0 < n ≤ 10,0 < m ≤ 20;
对于 60%的数据,0 < n ≤ 100,0 < m ≤ 2000;
对于 100%的数据,0 < n ≤ 10,000,0 < m ≤ 200,000,0 < x,y,s,t ≤ n,x ≠ t。
【输入输出样例1说明】
如上图所示,箭头表示有向道路,圆点表示城市。起点 1 与终点 3 不连通,所以满足题目描述的路径不存在,故输出-1。
【输入输出样例2说明】
如上图所示,满足条件的路径为 1->3->4->5。注意点 2 不能在答案路径中,因为点 2 连了一条边到点 6,而点 6 不与终点 5 连通。
NOIP2014 提高组 Day2
解析:这里我们用 h1 储存所有边,h2 储存所有逆向边。
1.反向bfs一次,即可得到每个点能否到达终点 t ,记为 flag[i]。
2.接下来,就是求 s 到 t 的最短路,由于每条边的长度都是 1 ,所以可以直接采用 bfs 来做。
我在这里这里也是采用逆向的 bfs,假设存在 x-->t 这样的一条边,逆向添加 x 时,要先检查 x 的所有正向边链接的点是否能到达 t ,即flag值是否为true,若为false,则不能添加。(正向也是可以的)
代码:
Accepted
标签:图结构NOIP提高组2014
描述
在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件:路径上的所有点的出边所指向的点都直接或间接与终点连通。
在满足条件 1 的情况下使路径最短。
注意:图 G 中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。
格式
输入格式
第一行有两个用一个空格隔开的整数 n 和 m,表示图有 n 个点和 m 条边。接下来的 m 行每行 2 个整数 x、y,之间用一个空格隔开,表示有一条边从点 x 指向点y。
最后一行有两个用一个空格隔开的整数 s、t,表示起点为 s,终点为 t。
输出格式
输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出-1。
样例1
样例输入1[复制]
3 2 1 2 2 1 1 3
样例输出1[复制]
-1
样例2
样例输入2[复制]
6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5
样例输出2[复制]
3
限制
对于 30%的数据,0 < n ≤ 10,0 < m ≤ 20;对于 60%的数据,0 < n ≤ 100,0 < m ≤ 2000;
对于 100%的数据,0 < n ≤ 10,000,0 < m ≤ 200,000,0 < x,y,s,t ≤ n,x ≠ t。
提示
【输入输出样例1说明】如上图所示,箭头表示有向道路,圆点表示城市。起点 1 与终点 3 不连通,所以满足题目描述的路径不存在,故输出-1。
【输入输出样例2说明】
如上图所示,满足条件的路径为 1->3->4->5。注意点 2 不能在答案路径中,因为点 2 连了一条边到点 6,而点 6 不与终点 5 连通。
来源
NOIP2014 提高组 Day2解析:这里我们用 h1 储存所有边,h2 储存所有逆向边。
1.反向bfs一次,即可得到每个点能否到达终点 t ,记为 flag[i]。
2.接下来,就是求 s 到 t 的最短路,由于每条边的长度都是 1 ,所以可以直接采用 bfs 来做。
我在这里这里也是采用逆向的 bfs,假设存在 x-->t 这样的一条边,逆向添加 x 时,要先检查 x 的所有正向边链接的点是否能到达 t ,即flag值是否为true,若为false,则不能添加。(正向也是可以的)
代码:
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; const int maxn=1e4; int q[maxn+10]; bool flag[maxn+10],used[maxn+10]; struct tnode{ int d; tnode *next; }*h1[maxn+10],*h2[maxn+10]; int getin() { int ans=0;char tmp; while(!isdigit(tmp=getchar())); do ans=(ans<<3)+(ans<<1)+tmp-'0'; while(isdigit(tmp=getchar())); return ans; } void add1(int u,int v) { tnode *p=new tnode; (*p).d=v,(*p).next=h1[u],h1[u]=p; } void add2(int u,int v) { tnode *p=new tnode; (*p).d=v,(*p).next=h2[u],h2[u]=p; } bool ok(int u) { if(!flag[u] || used[u])return 0; tnode *p=h1[u]; while(p) { if(!flag[(*p).d])return 0; p=(*p).next; } return 1; } int main() { int n,m,i,x,y,s,t,l,r,k,ans=0; tnode *p; n=getin(),m=getin(); for(i=1;i<=m;i++) { x=getin(),y=getin(); add1(x,y),add2(y,x); } s=getin(),t=getin(); l=r=1,q[1]=t,flag[t]=1; while(l<=r) { p=h2[q[l]],l++; while(p) { if(!flag[(*p).d])q[++r]=(*p).d,flag[(*p).d]=1; p=(*p).next; } } if(!flag[s]){printf("-1\n");return 0;} l=r=1,q[1]=t,k,used[t]=1; while(l<=r) { for(i=l,k=r;i<=k;i++) for(p=h2[q[i]];p;p=(*p).next) { if(!ok((*p).d))continue; if((*p).d==s){printf("%d\n",ans+1);return 0;} q[++r]=(*p).d,used[q[r]]=1; } l=k+1,ans++; } printf("-1\n"); return 0; }
相关文章推荐
- noip2014 无线网路发射器选址 (模拟)
- HDU 2579--Dating with girls(2)【BFS && 三维判重】
- 导入数据时报错: MySQL server has gone away
- noip2014 联合权值 (树形结构)
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)
- noip2014 生活大爆炸版 石头剪刀布 (模拟)
- (抽象)类和接口细节分析
- 利用 thermald和Intel P-state防止笔记本过热
- AngularJS教程
- 本地建立svn管理项目
- poj2449 Remmarguts' Date
- TCP和UDP的区别
- 欢迎使用CSDN-markdown编辑器
- Ubuntu14.04设置静态ip + /etc/resolv.conf 文件修改丢失的解决方案
- linux中shell变量$#,$@,$0,$1,$2的含义
- ios学习之苹果官方文档的学习(UIFocusUpdateContext方面)
- LeetCode(151) Reverse Words in a String
- LeetCode(151) Reverse Words in a String
- noip2014 子矩阵 (动态规划+位运算)
- Hibernate环境搭建