1434. Buses in Vasyuki 夜

http://acm.timus.ru/problem.aspx?space=1&num=1434

将每一条线路 看成一个点  有共同站点的线路连一条边 并记录是那个共同站点  由于可能有多个共同站点  为了节约内存 应该避免建重边 

拥有出发站点的线路可以作为搜索的起点 拥有终点站点的线路可以是搜索的终点  这样的话用来搜索起点和终点就有多个了

然后一遍bfs  最先搜到的终点 为最近  然后注意记录路径

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
#define sint short int
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N=100005;
const int M=2000005;
const int K=1005;
int head[K],I;
struct node
{
    int j,next;
    int k;
}side[M];
bool dist[K];
bool L[K][K];
int f[K],kf[K];
bool nd[K];
vector<int>road;
queue<int>qt;
vector<int>link[N];
void add(int i,int j,int k)
{
    if(L[i][j]==true)
    return ;
    L[i][j]=true;
    side[I].j=j;
    side[I].next=head[i];
    side[I].k=k;
    head[i]=I++;
}
void init(int n,int m)
{
    memset(head,-1,sizeof(head));
    memset(L,false,sizeof(L));
    I=0;
    for(int i=1;i<=m;++i)
    link[i].clear();
    for(int i=1;i<=n;++i)
    {
        int tmp;
        cin>>tmp;
        while(tmp--)
        {
            int k;
            cin>>k;
            for(unsigned j=0;j<link[k].size();++j)
            {
                if(link[k][j]==i)
                break;
                add(link[k][j],i,k);add(i,link[k][j],k);
            }
            link[k].push_back(i);
        }
    }
}
int bfs(int n)
{
    int flag=0;
    while(!qt.empty())
    {
        int x=qt.front();qt.pop();
        if(nd[x]==true)
        {flag=x;break;}
        for(int t=head[x];t!=-1;t=side[t].next)
        {
            int j=side[t].j;
            if(dist[j]==false)
            {
                dist[j]=true;
                f[j]=x;
                kf[j]=side[t].k;
                qt.push(j);
            }
        }
    }
    if(flag)
    {
        int k=flag;
        while(f[k]!=-1)
        {
            road.push_back(kf[k]);
            k=f[k];
        }
    }
    return flag;
}
int main()
{
    //freopen("data.in","r",stdin);
    int n,m;
    cin>>n>>m;
    init(n,m);
    int x1,x2;
    cin>>x1>>x2;
    if(x1==x2)
    {cout<<"0"<<endl;cout<<x1<<endl;return 0;}
    memset(dist,false,sizeof(dist));
    memset(f,-1,sizeof(f));
    memset(nd,false,sizeof(nd));
    for(unsigned int i=0;i<link[x1].size();++i)
    {dist[link[x1][i]]=true;qt.push(link[x1][i]);}
    for(unsigned int i=0;i<link[x2].size();++i)
    {nd[link[x2][i]]=true;}
    if(!bfs(n))
    {cout<<"-1"<<endl;return 0;}
    road.insert(road.begin(),x2);
    cout<<road.size()<<endl;
    cout<<x1;
    for(int i=road.size()-1;i>=0;--i)
    cout<<" "<<road[i];
    cout<<endl;
    return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2871976.html