• 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 }
  • 相关阅读:
    [转]谁抢了我的焦点
    VBA 对比两行数据
    VBA 自动得到分数
    VBA Excel 对比两列数据
    将图片读到二进制
    [转]常用字符与ASCII代码对照表
    [转]Java 运算符的优先级
    SqlBulkCopy 快速插入数据
    多列转一行
    C# 线程小结
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5574998.html
Copyright © 2020-2023  润新知