noip2014提高组day2二题题解-rLq

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

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

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

本题地址: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快吗)

大水题,我果然要完……

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 typedef struct{
 5         int to;
 6         int next;
 7 }line;
 8 line gra[200001],shg[200001];
 9 int head[10001]={0},shh[10001]={0},num=0,note[10001]={0};
10 int n,m;/*n个点,m条边*/
11 int s,t;
12 int dis[10001],que[10001]={0},pos[10001]={0};
13 int add(int from,int to){
14     num++;
15     gra[num].next=head[from];
16     gra[num].to=to;
17     head[from]=num;
18     shg[num].next=shh[to];
19     shg[num].to=from;
20     shh[to]=num;
21     return 0;
22 }
23 int point(int goal){
24     int l=shh[goal];
25     while(l!=0){
26           if(note[shg[l].to]==0){
27              note[shg[l].to]=1;
28              point(shg[l].to);
29           }
30           l=shg[l].next;
31     }
32     return 0;
33 }
34 int shut(){
35     int i=1;
36     while(i<=n){
37           if(note[i]==0&&i!=t){
38              int l=shh[i];
39              while(l!=0){
40                    head[shg[l].to]=0;
41                    l=shg[l].next;
42              }
43           }
44           i++;
45     }
46     return 0;
47 }
48 int spfa(){
49     for(int i=1;i<=n;i++) dis[i]=10000000;
50     int l,he=0,tail=1;
51     dis[s]=0;
52     que[he]=s;
53     pos[s]=1;
54     do{
55        l=head[que[he]];
56        while(l!=0){
57              if(dis[gra[l].to]>=dis[que[he]]+1){
58                 dis[gra[l].to]=dis[que[he]]+1;
59                 if(pos[gra[l].to]==0){
60                    tail++;
61                    que[tail]=gra[l].to;
62                    pos[gra[l].to]=1;
63                 }
64              }
65              l=gra[l].next;
66        }
67        he++;
68     }while(he<=tail);
69     if(dis[t]==10000000) return -1;
70     else return dis[t];
71 }
72 int main(){
73     scanf("%d %d",&n,&m);
74     for(int i=1;i<=m;i++){
75             scanf("%d %d",&s,&t);
76             add(s,t);
77     }
78     scanf("%d %d",&s,&t);
79     point(t);
80     shut();
81     if(note[s]==0){
82        printf("-1");
83        return 0;
84     }
85     //for(int i=1;i<=n;i++) printf("%d ",note[i]);
86     printf("%d",spfa());
87     return 0;
88 }
时间: 2024-10-02 21:24:10

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

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

啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊

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

暴力枚举. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[130][130],d,n,x,y,z,num,ans=-2147483647; 5 int main() 6 { 7 scanf("%d%d",&d,&n); 8 for(int i=1;i<=n;i++) 9 { 10 scanf("%d%d%d",&x,

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

存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什么的随意. 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define N 10001 7 vector

NOIP提高组2004 合并果子题解

NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出

NOIP2014提高组总结

-by mps 尽管今年没参加NOIP2014提高组,但是做了一下,还是有感受的,在这里写出我500分的思路(满分以后会更改,毕竟能力有限......) Day 1 T1 生活大爆炸版石头剪子布 [题目大意] 石头剪子布大家都玩过,只不过这题加了“斯波克”和“蜥蜴人”,事实上还是蛮简单的,有基本逻辑推理常识和基本代码处理能力即可AC,放在PJ都是第一题的难度... 一般有三种做法: 文艺青年:写个矩阵来表示得失,注意要判断两次(甲对乙及乙对甲) 普通青年:16个if嵌套 二B青年:25个if无嵌

[NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

NOIP2008提高组(前三题) -SilverN

此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件matches.out共一行,

noip2008普及组3题题解-rLq

(第一次写题解,随意喷) (只是前一天的作业哈) (先凑个数) 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目.聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次

noip2008普及组4题题解-rLq

(啊啊啊终于补到了今天的作业了) 本题地址:http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图.小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:每个顶