NOIP2014 寻找道路
2.寻找道路
(road.cpp/c/pas)
【问题描述】
在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
1.路径上的所有点的出边所指向的点都直接或间接与终点连通。
2.在满足条件1的情况下使路径最短。
注意:图G中可能存在重边和自环,题目保证终点没有出边。
请你输出符合条件的路径的长度。
【输入】
输入文件名为road.in。
第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边。
接下来的m行每行2个整数x、y,之间用一个空格隔开,表示有一条边从点x指向点y。
最后一行有两个用一个空格隔开的整数s、t,表示起点为s,终点为t。
【输出】
输出文件名为road.out。
输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出-1。
【输入输出样例1】
road.in |
road.out |
3 2 1 2 2 1 1 3 |
-1 |
【输入输出样例说明】
如上图所示,箭头表示有向道路,圆点表示城市。起点1与终点3不连通,所以满足题目描述的路径不存在,故输出-1。
【输入输出样例2】
road.in |
road.out |
6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5 |
3 |
【输入输出样例说明】
如上图所示,满足条件的路径为1->3->4->5。注意点2不能在答案路径中,因为点2连了一条边到点6,而点6不与终点5连通。
【数据说明】
对于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。
【思路】
很简单可以想到:先一遍搜索判断出满足条件的点,再一遍BFS计算最短路。
学了别人的一种方法:对于结点的边建立一个链表,e[]记录边,first[]是表头,Edge 中的next域为指向下一条边的指针。很实用的方法。
另外用到了一个技巧,正反向边依顺序加入,根据标号判断是正向还是反向,只用一个BFS完成操作。
教训:提前就应该分析数据考虑怎样存储,不能想当然。
【代码】
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#define REP(a,b,c) for(int a=(b);a<=(c);a++)
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
//注意如果REP(i,0,G[u].size()-1)会出BUG
//vector G[u]表示出边 不能用 n<=200000如果一个出边特别大的话就会超内存
//利用边的加入顺序达到记录反向边的效果
using namespace std; const int maxn = ; struct Edge{
int u,v,next;
}edges[maxn];
int en=;
int first[maxn];
//存图方法: edges存正反向边 edges.size()==en firts[u]是邻接表的首
//邻接表中存储相连边 int d[maxn];
int vis[maxn];
int n,m,s,t; void add(int u,int v){
en++;
edges[en].u=u; edges[en].v=v;
edges[en].next=first[u];
first[u]=en;
} void bfs(int s,int flag) { //flag标志正反向
memset(d,-,sizeof(d));
queue<int> q; q.push(s);d[s]=;
//vis[s]不要标记否则第一次把t标记正向不能访问
while(!q.empty()) {
int u=q.front(); q.pop();
for(int j=first[u];j>;j=edges[j].next) if(j%==flag && !vis[edges[j].v]) {
int v=edges[j].v;
if(d[v] == -){ //d==-1 的判断
d[v]=d[u]+;
q.push(v);
}
}
}
return ;
} int main() {
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
REP(i,,m) {
int u,v; scanf("%d%d",&u,&v);
add(u,v); //正反向添加两条边 关系为相 ^
add(v,u);
}
scanf("%d%d",&s,&t); bfs(t,); //%==0为反向边
for(int j=;j<=*m;j+=) if(d[edges[j].v]==-) //由can推vis 而不能直接在can上操作
//注意只枚举正向边
vis[edges[j].v]=vis[edges[j].u]=; bfs(s,);
printf("%d",d[t]);
return ;
}
NOIP2014 寻找道路的更多相关文章
- 【DFS】【图论】NOIP2014寻找道路
[NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所 ...
- 【洛谷P2296】[NOIP2014]寻找道路
寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...
- [NOIP2014]寻找道路(图论)
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 1807. [NOIP2014]寻找道路P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- [洛谷P2296] NOIP2014 寻找道路
问题描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- [NOIP2014]寻找道路 题解
题目大意: 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足 ...
- luogu2296 [NOIp2014]寻找道路 (bfs)
反着建边,从T bfs找合法的点,然后再正着bfs一下求最短路就行了 #include<bits/stdc++.h> #define pa pair<int,int> #def ...
- NOIP2014 day2 t2 寻找道路
寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
随机推荐
- Java在mysql插入数据的时候的乱码问题解决
今天在使用hibernate的时候,插入mysql的数据中的中文总是显示乱码,之前出现过类似的问题,但是没有太在意,今天又发生了.所以向彻底的解决一下. 参考的博文: http://www.cnblo ...
- Linux中的MyEclipse配置Hadoop
一.所需软件 注意:安装MyEclipse后,我再已安装软件里找不到MyEclipse,所以我在root权限下用命令行启动MyEclipse,貌似避免了很多权限问题. sudo su 输入密码 cd ...
- [转载]MongoDB设置访问权限、设置用户
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...
- URAL 1009 K-based numbers(DP递推)
点我看题目 题意 : K进制的N位数,不能有前导零,这N位数不能有连续的两个0在里边,问满足上述条件的数有多少个. 思路 : ch[i]代表着K进制的 i 位数,不含两个连续的0的个数. 当第 i 位 ...
- hdu 4678 Mine 博弈论
这是一题简单的博弈论!! 所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1: 其他所有的数字(个数为m)的SG值为m%2. 再就是用dfs将空白部分搜一下即可!(注意细节) ...
- http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html
http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html
- QT插件开发方式(作者有RemOjbects文档翻译(48)篇)
创建一个QT的库项目,删除自动生成的.h和.cpp文件,添加一个接口定义.h文件和一个接口实现类(一个.h一个.cpp).代码如下: 1.接口文件源码 #ifndef PLUGININTERFACE_ ...
- HDU1312——Red and Black(DFS)
Red and Black Problem DescriptionThere is a rectangular room, covered with square tiles. Each tile i ...
- Android 动态Tab分页效果
当前项目使用的是TabHost+Activity进行分页,目前要做个报表功能,需要在一个Tab页内进行Activity的切换.比方说我有4 个Tab页分别为Tab1,Tab2,Tab3,Tab4,现在 ...
- WinCE下VPN设置
一.环境 1. WinCE5.0+2004/2005/2006/2007补丁. 2. 3G拨号模块. 二.说明 1. WinCE设备必须可以接入网络. 2. 支 ...