(又是昨天的作业……本题写于昨天)

(这破题都做这么久,我是不是吃枣药丸……)

(好吧这是一道图论题呢)

本题地址:http://www.luogu.org/problem/show?pid=2296

题目描述

在有向图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:

3 2
1 2
2 1
1 3

输出样例#1:

-1

输入样例#2:

6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5

输出样例#2:

3

说明

解释1:
 
如上图所示,箭头表示有向道路,圆点表示城市。起点1 与终点3 不连通,所以满足题
目᧿述的路径不存在,故输出- 1 。 
解释2:

如上图所示,满足条件的路径为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。

------------------------------您的好友分割线菌正在登录中----------------------------------------------------------------------------------------------------

题意要理解对啊

首先得去掉不能去的点,dfs就行了

大概输入时存一个反图,然后把反图中从终点不能到的点标记,再把这些点反图中出边连着的点在正图中去掉就好了(只需去掉直接相连点的哈)

接着上最短路(SPFA真的比dij快吗)

大水题,我果然要完……

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int to;
int next;
}line;
line gra[],shg[];
int head[]={},shh[]={},num=,note[]={};
int n,m;/*n个点,m条边*/
int s,t;
int dis[],que[]={},pos[]={};
int add(int from,int to){
num++;
gra[num].next=head[from];
gra[num].to=to;
head[from]=num;
shg[num].next=shh[to];
shg[num].to=from;
shh[to]=num;
return ;
}
int point(int goal){
int l=shh[goal];
while(l!=){
if(note[shg[l].to]==){
note[shg[l].to]=;
point(shg[l].to);
}
l=shg[l].next;
}
return ;
}
int shut(){
int i=;
while(i<=n){
if(note[i]==&&i!=t){
int l=shh[i];
while(l!=){
head[shg[l].to]=;
l=shg[l].next;
}
}
i++;
}
return ;
}
int spfa(){
for(int i=;i<=n;i++) dis[i]=;
int l,he=,tail=;
dis[s]=;
que[he]=s;
pos[s]=;
do{
l=head[que[he]];
while(l!=){
if(dis[gra[l].to]>=dis[que[he]]+){
dis[gra[l].to]=dis[que[he]]+;
if(pos[gra[l].to]==){
tail++;
que[tail]=gra[l].to;
pos[gra[l].to]=;
}
}
l=gra[l].next;
}
he++;
}while(he<=tail);
if(dis[t]==) return -;
else return dis[t];
}
int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d %d",&s,&t);
add(s,t);
}
scanf("%d %d",&s,&t);
point(t);
shut();
if(note[s]==){
printf("-1");
return ;
}
//for(int i=1;i<=n;i++) printf("%d ",note[i]);
printf("%d",spfa());
return ;
}

noip2014提高组day2二题题解-rLq的更多相关文章

  1. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  2. NOIP提高组历年真题题解

    2018 铺设道路 差分水题,推一下结论就好了. #include<cstdio> #include<algorithm> using namespace std; ],d[] ...

  3. NOIp2014提高组初赛错题简析

    总体分析 \(89pts\),粗略来看选择题错的比较多,\(-6pts\).同时又是尿性的填空杀扣了\(5pts\). 不过后面的两大题全对了还是可喜可贺 错题精析 单项选择T8 编译器的主要功能是( ...

  4. 【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

    存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什 ...

  5. 【暴力】洛谷 P2038 NOIP2014提高组 day2 T1 无线网络发射器选址

    暴力枚举. #include<cstdio> #include<algorithm> using namespace std; ][],d,n,x,y,z,num,ans=-; ...

  6. 刷题总结——飞扬的小鸟(NOIP2014提高组)

    题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...

  7. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  8. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  9. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

随机推荐

  1. 【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world

    好了,还是这张图,还是一样的Hello world. 因为本章其实很多都是讲一些命令行编译啊什么鬼的配置类的东西,要用的时候直接百度或者回头查书就可以了, 所以了解一下也就行了,也没有记录下来,接下来 ...

  2. csharp:VerifyCode in winform or webform

    winform: using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  3. FreeBSD的新一代包管理工具Pkg 1.3.0 发布

    Pkg 是 FreeBSD 下一代的打包管理工具,用来替代原来的 pkg_info/pkg_create/pkg_add 工具,可以本地打包,也提供远程打包,主要是为了方便远程二进制包升级. Pkg ...

  4. 为什么.NET感觉上比Java差一点

    其实,我本人很喜欢.NET技术.工作经历中,大部分时间也在使用.NET开发. 这几年,由于工作的原因,开始进入Java+Linux世界. 今年,开始学习Python和Scala. 使用.NET时,有种 ...

  5. Picasso

    1.简介 Picasso是Square公司出品的一个强大的图片下载和缓存图片库1)在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解 ...

  6. SQL数据库基础(一)

    数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(Data ...

  7. Echarts图表控件使用总结1(Line,Bar)

    问题篇(详解):http://www.cnblogs.com/hanyinglong/p/4708337.html 1.前言 a.在系统开发过程中可能会使用到图表控件,一个好的图标控件可以使我们的网站 ...

  8. ASP.NET Url重写

    新建一个类,并实现IHttpModule接口 实现接口,在Init方法中处理请求,在请求方法中实现具体的Url重写操作 补充Url重写方法,通过 Request的Path对象获取请求文件路径,并根据请 ...

  9. ArcEngine 0x8004023C

    在进行缓冲区查询时,查询的并是不要素本身的范围,而是缓冲一定半径,所以用到了ITopologicalOperator接口,主要是利用其buffer方法,代码如下: IFeatureClass pFea ...

  10. 【转】android应用程序的安装方式与原理

    四种安装方式: 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用安装――通过SD卡里的 ...