寻找道路(bfs,有向图,反有向图)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

1.路径上的所有点的出边所指向的点都直接或间接与终点连通。

2.在满足条件1的情况下使路径最短。

注意:图G中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

输入描述:

第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边。
接下来的m行每行2个整数x、y,之间用一个空格隔开,表示有一条边从点x指向点y。
最后一行有两个用一个空格隔开的整数s、t,表示起点为s,终点为t。

输出描述:

输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出-1。

示例1

输入

复制3 2 1 2 2 1 1 3

3 2
1 2
2 1
1 3

输出

复制-1

-1

说明

 
  

寻找道路(bfs,有向图,反有向图)_第1张图片

如上图所示,箭头表示有向道路,圆点表示城市。起点1与终点3不连通,所以满足题目描述的路径不存在,故输出-1。

示例2

输入

复制6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5

6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5

输出

复制3

3

说明

 
  

寻找道路(bfs,有向图,反有向图)_第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。

分析:

如果此题是单单的找一个最短路径,那么就非常简单,但是本题加了一个限制条件,那就是路径上每个点所连的点都必须间接或直接与终点相连。

1.构建一个反无向图,终点能到的点设置为true,这样在bfs的时候,判断与本次遍历点相连的点是否为true,如果是,则可以加进来


#include
using namespace std;
typedef long long ll;
vector t[200008];
vector ft[200008];
bool check[200008];
bool used[200008];
ll l[200008];
ll n,m;
queue q,fq;
void fbfs()
{
    while(fq.size())
    {
        auto res=fq.front();
        fq.pop();
        for(auto p:ft[res])
        {
            if(check[p])continue;
            check[p]=true;
            fq.push(p);
        }
    }
}
void bfs()
{
    while(q.size())
    {
        auto res=q.front();
        q.pop();
         for(auto p:t[res])
        {
            ll fw=0;
           if(used[p])continue;
           for(auto p1:t[p])
           {
               if(!check[p1])
               {
                   fw=1;
                   break;
               }
           }
            if(fw==1)continue;
           l[p]=l[res]+1;
             used[p]=1;
             q.push(p);
        }
    }
}
void solve()
{
  cin>>n>>m;
    for(ll i=0;i>x>>y;
        t[x].push_back(y);
        ft[y].push_back(x);
    }
    ll s,t;
    cin>>s>>t;
    q.push(s);
    check[t]=true;
    fq.push(t);
    fbfs();
    used[s]=1;
    l[t]=-1;
    l[s]=0;
    bfs();
    cout<

你可能感兴趣的:(算法)