UOJ 19 [NOIP2014]寻找道路

原创 2016年08月29日 18:12:37

图的遍历+最短路。

第一眼看,好难,不会做。

仔细一看,发现只要一次反向边BFS把不合题意的点全部丢掉就可以直接跑最短路了- -

顺利打完之后被hack成97分,原因是没有判断起点直接不可取的情况。改后AC。

#include<cstdio>
#include<queue>
#include<cstring>
#define N 10005
#define M 200005
using namespace std;
struct edge{int next,to;}e[M<<1];
int cnt=0, last[2][N], n, m, s, t, d[N];
bool vis[N], ban[N], inq[N];
void add(int i, int a, int b)
{
    e[++cnt]=(edge){last[i][a],b};
    last[i][a]=cnt; 
}
void bfs(int beg)
{
    queue<int> q;
    q.push(beg);
    vis[beg]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i = last[1][x]; i; i=e[i].next)
        {
            int y=e[i].to;
            if(vis[y])continue;
            vis[y]=1;
            q.push(y);
        }
    }
}
void solve()
{
    for(int i = 1; i <= n; i++)
        if(!vis[i])
            for(int j = last[1][i]; j; j=e[j].next)
                ban[e[j].to]=1;
}
int SPFA(int beg, int end)
{
    if(ban[beg])return -1;
    memset(d,63,sizeof(d));
    queue<int> q;
    q.push(beg);
    d[beg]=0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        inq[x]=0;
        for(int i = last[0][x]; i; i=e[i].next)
        {
            int y=e[i].to;
            if(ban[y] || d[x]+1>=d[y])continue;
            d[y]=d[x]+1;
            if(!inq[y])
            {
                inq[y]=1;
                q.push(y);
            }
        }
    }
    return d[end];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int a, b, i = 1; i <= m; i++)
    {
        scanf("%d%d",&a,&b);
        add(0,a,b);
        add(1,b,a);
    }
    scanf("%d%d",&s,&t);
    bfs(t);
    solve();
    int ans = SPFA(s, t);
    printf("%d\n",ans>N?-1:ans);
} 
版权声明:本文为蒟蒻原创文章,应该没什么人会转载的,要转载就注明出处吧。

【NOIP2014】UOJ #19 CODE[VS] 3731 寻找道路 反向建图+SPFA

写了两天基础算法了 整理了以前的题发现了这个宝♂贝 反向建图的好题 在正反两张图中都需要做一些处理 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请...

(noip 2014 寻找道路)<有向图最短路>

最短路

noip2014 寻找道路 (两次逆向宽搜)

P1909寻找道路 Accepted 标签:图结构NOIP提高组2014 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点...

Noip2014寻找道路题解

题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点...
  • t14t41t
  • t14t41t
  • 2015年05月28日 17:54
  • 961

#NOIP 2014# day.2 T2 寻找道路

先把满足要求的点找出来,在满足要求的点的新图上求个最短路即可。 #include #include #include #include using namespace std;const in...

[NOIP2014]寻找道路 D2 T2 bfs

come on 题目描述这题实在是太水了 因为是有向图 又要求每一个点都是双向联通。。。。 偶 那你就从终点BFS(DFS)一一遍就行了 把所有不能到达的点标记一下 然后从起点跑sssp就...

【noip2014】tyvj4058 寻找道路

以后见到我了,请叫我智障。不用客气。说实话,真心感觉这题 挺简单的,然而 正确率啊 我的妈一开始 其实 我以为 这题 是 考图的 联通 性的。然后发现自己 想错了。没啥嘛,就是 从终点 bfs一遍 ...
  • mars_ch
  • mars_ch
  • 2016年09月03日 11:30
  • 106

NOIP2014 寻找道路 解题报告(dfs+bfs)

在线评测: http://codevs.cn/problem/3731/ 整体思路: 先从(在反向图中)终点dfs一遍,然后所有能到达在dfs中没有搜到的点也标记为不可用,然后正向b...

【noip2014】寻找道路

题目描述在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。2 .在满足条件1 ...

NOIP-2014 寻找道路

NOIP-2014 寻找道路
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UOJ 19 [NOIP2014]寻找道路
举报原因:
原因补充:

(最多只允许输入30个字)