sdut oj 3058 路线冲突问题(BFS+记录路径算法,回溯路径 )

路线冲突问题

题目描述

给出一张地图,地图上有n个点,任意两点之间有且仅有一条路。点的编号从1n

现在兵团A要从s1e1,兵团B要从s2到e2,问两条路线是否会有交点,若有则输出交点个数,否出输出”success”。

输入

多组输入。

对于每组输入。

第一行输入n1 <= n <= 100000),代表点的个数。

接下来的n-1行,每行包含两个整数u,v(1 <= u,v <= n),代表uv之间有一条相连。

再接下里的一行包含四个整数s1,e1,s2,e21 <= s1,e1,s2,e2 <= n)。

输出

 问两条路线是否会有交点,若有则输出交点个数,否出输出”success”。

示例输入

3
1 2
2 3
1 2 2 3

示例输出

1

算法分析:两次bfs记录下起点到终点的路径就行了,然后比较两条路径有没有重合点。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

vector<int>q[100002];
bool vis[100002];
int fa[100002];
bool path[100002];

void BFS(int s, int e)
{
    memset(vis, false, sizeof(vis));
    memset(fa, 0, sizeof(fa));
    vis[s]=true;
    queue<int>p;
    int i, j, len;
    while(!p.empty())
        p.pop();
    p.push(s);
    int flag=0;
    while(!p.empty())
    {
        int dd=p.front();
        p.pop();
        len=q[dd].size();
        for(i=0; i<len; i++)
        {
            if( vis[q[dd][i]]==false  )
            {
                fa[ q[dd][i] ] = dd; //记录前驱
                //printf("%d--%d
", dd, fa[q[dd][i]] );
                if(q[dd][i]==e) //找到终点跳出
                {
                    flag=1; break;
                }
                p.push( q[dd][i] );
                vis[ q[dd][i] ] =true;
            }
        }
        if(flag==1)
            break;
    }
}

int main()
{
    int n;
    int i, j;
    int u, v;
    int a, b, x, y;

    while(scanf("%d", &n)!=EOF)
    {
        for(i=0; i<=n; i++)
            q[i].clear();
        for(i=0; i<n-1; i++)
        {
            scanf("%d %d", &u, &v);
            q[u].push_back(v);
            q[v].push_back(u);
        }
        scanf("%d %d %d %d", &a, &b, &x, &y);
        BFS(a, b);//fa数组弹出
        memset(path, false, sizeof(path));
        for(i=fa[b]; i!=0; i=fa[i] )
        {
            path[i]=true;
        }
        path[b]=true;

        BFS(x, y);
        int cnt=0;
        for(j=fa[y]; j!=0; j=fa[j] )
        {
            if(path[j]==true)
                cnt++;
        }
        if(path[y]==true)
            cnt++;

        if(cnt==0)
            printf("success
");
        else
            printf("%d
", cnt);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yspworld/p/4267904.html