zoukankan      html  css  js  c++  java
  • 1807. [NOIP2014]寻找道路

     

    ★☆   输入文件:roadb.in   输出文件:roadb.out   简单对比

    时间限制:1 s   内存限制:128 MB

    【题目描述】

    正反存两个图,预处理出不能走得点:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<cmath>
    #include<vector>
    
    using namespace std;
    const int N=10005;
    const int Maxn=99999999;
    
    int head[N],head_2[N];
    int dis[N];
    bool vis[N],visit[N];
    int now=1,now_2=1;
    int n,m,start,endd;
    struct node{
        int u,v,w,nxt;
    }E[N*20];
    struct Node{
        int u,v,w,nxt;
    }EE[N*20];
    queue<int>q;
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    inline void add(int u,int v)
    {
        E[now].v=v;
        E[now].w=1;
        E[now].nxt=head[u];
        head[u]=now++;
    }
    
    inline void add_2(int u,int v)
    {
        EE[now_2].v=v;
        EE[now_2].w=1;
        EE[now_2].nxt=head_2[u];
        head_2[u]=now_2++;
    }
    
    inline void spfa_1(int start)
    {
        for(int i=1;i<=n;i++)
            dis[i]=Maxn;
        dis[start]=0;
        vis[start]=1;
        q.push(start);
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            vis[top]=0;
            for(int i=head_2[top];~i;i=EE[i].nxt)
                if(dis[EE[i].v]==Maxn)
                {
                    dis[EE[i].v]=dis[top]+EE[i].w;
                    if(!vis[EE[i].v])
                        vis[EE[i].v]=1,
                        q.push(EE[i].v);
                }
        }
        for(int i=1;i<=n;i++)
            if(dis[i]==Maxn)
                for(int j=head_2[i];~j;j=EE[j].nxt)
                    visit[EE[j].v]=1;
    }
    
    inline void spfa_2(int start)
    {
        for(int i=1;i<=n;i++)
            dis[i]=Maxn;
        dis[start]=0;
        vis[start]=1;
        q.push(start);
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            vis[top]=0;
            for(int i=head[top];~i;i=E[i].nxt)
                if(dis[E[i].v]>dis[top]+E[i].w&&!visit[E[i].v])
                {
                    dis[E[i].v]=dis[top]+E[i].w;
                    if(!vis[E[i].v])
                        vis[E[i].v]=1,
                        q.push(E[i].v);
                }
        }
        if(dis[endd]==Maxn)
            printf("-1");
        else
            printf("%d",dis[endd]);
    }
    
    int main()
    {
        freopen("roadb.in","r",stdin);
        freopen("roadb.out","w",stdout);
        n=read(),m=read();
        for(int i=1;i<=n;i++)
            head[i]=head_2[i]=-1;
        for(int i=1;i<=m;i++)
        {
            int u=read(),v=read();
            add(u,v);
            add_2(v,u);
        }
        start=read(),endd=read();
        spfa_1(endd);
        spfa_2(start);
        return 0;
    }
  • 相关阅读:
    【linux高级程序设计】(第八章)进程管理与程序开发 3
    【linux高级程序设计】(第八章)进程管理与程序开发 2
    【linux高级程序设计】(第八章)进程管理与程序开发 1
    【linux高级程序设计】(第七章)终端及串口编程 未完成
    【剑指offer】数值的整数次方
    【剑指offer】二进制中1的个数
    【剑指offer】替换空格
    Android 最新控件 Toolbar
    IE 扩展调用主窗体中的函数
    JAVA程序设计(12.3)---- 监听器0基础应用:五子棋
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7126850.html
Copyright © 2011-2022 走看看