zoukankan      html  css  js  c++  java
  • 最短路 || UOJ 19 寻找道路

    UOJ j19 寻找道路
    在有向图G中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的最短路径,该路径满足以下条件:
    路径上的所有点的出边所指向的点都直接或间接与终点连通。
    *解法:反着建图,从终点bfs找能到达的点标记
    在找一遍所有点中 如果某个点的入度点没做过标记 那么这个点就要被刨除
    剩下的点中找最短路
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    #define S 200005
    #define INF 1e9+10
    int head[S], nxt[S], l[S], tot = 0, vis[S], flag[S], use[S], dist[S];
    void build(int f, int t)
    {
        l[++tot] = t;
        nxt[tot] = head[f];
        head[f] = tot;
    }
    queue<int> q;
    void bfs(int s)
    {
        vis[s] = 1;
        q.push(s);
        while(!q.empty())
        {
            int u = q.front(); q.pop();
            for(int i = head[u];i;i = nxt[i])
            {
                //注意这里的i指的是边,l[i]指的是点
                int v = l[i];
                if(!vis[v])
                    vis[v] = 1, q.push(v);
            }
        }
    }
    int spfa(int s, int e)
    {
        while(!q.empty()) q.pop();
        dist[s] = 0;
        use[s] = 1;
        q.push(s);
        while(!q.empty())
        {
            int u = q.front(); q.pop();
            use[u] = 0;
            for(int i = head[u];i;i = nxt[i])
            {
                int v = l[i];
                if(flag[v]) continue;
                if(dist[v] > dist[u] + 1)
                {
                    dist[v] = dist[u] + 1;
                    if(!use[v])
                        use[v] = 1, q.push(v);
                }
            }
        }
        return dist[e];
    }
    int main()
    {
        int n, m, x, y, s, e;
        scanf("%d %d", &n, &m);
        for(int i = 1; i <= n; i++) dist[i] = INF;
        for(int i = 0; i < m; i++)
        {
            scanf("%d %d", &x, &y);
            build(y, x);
        }
        scanf("%d %d", &s, &e);
        bfs(e);
        for(int i = 1; i <= n; i++)
        {
            if(vis[i]) continue;
            for(int j = head[i];j;j = nxt[j]) //注意这里的j指的是边,l[j]指的是点
                flag[l[j]] = 1;
        }
        int dis = spfa(e, s);
        if(dis == INF) dis = -1;
        printf("%d
    ", dis);
        return 0;
    }
  • 相关阅读:
    JSONP的学习(收集整理)
    10个必备的移动UI设计资源站(转)
    iscroll4框架解析[webapp开发](转)
    IE9中Media queries在iframe无效的解决方法
    mustache模板技术
    企业级的响应式设计(Responsive design at enterprise level)译
    在JSP中使用jQuery的冲突解决(收集整理)
    Java开发 Eclipse使用技巧(转)
    Front End中Javascript兼容问题收集(转)
    vector it->和*it
  • 原文地址:https://www.cnblogs.com/pinkglightning/p/8404719.html
Copyright © 2011-2022 走看看