zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    android之sharedpreference的两种使用方法
    andoird软件开发之一个记录账号密码的APP--bmob后台
    Android群英传笔记系列三 view的自定义:实现一个模拟下载
    android之文件操作——读取assets和raw文件下的内容
    fragment与viewPaper的使用
    Android之静态和动态加载Fragment
    Swift可选类型
    swift中的类型转化
    SDAutoLayerOut
    github 使用教程
  • 原文地址:https://www.cnblogs.com/liulangye/p/2871976.html
Copyright © 2011-2022 走看看