1072. Routing

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

简单 spfa

代码:

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<algorithm>

#include<vector>

#include<set>

#include<map>

#include<string>

#include<queue>

#include<stack>

#include <iomanip>

using namespace std;

#define LL long long

const int INF=0x3f3f3f3f;

//priority_queue<int,vector<int>,greater<int> >qt;

const int N=105;

int head[N],I;

struct node

{

    int j,next;

}side[N*N];

struct I

{

    int m;

    int a[7][4],b[7][4];

}mem[N];

vector<int>road;

void add(int i,int j)

{

    side[I].j=j;

    side[I].next=head[i];

    head[i]=I++;

}

bool equals(int I,int J)

{

    for(int i=0;i<mem[I].m;++i)

    for(int j=0;j<mem[J].m;++j)

    {

        int l;

        for(l=0;l<4;++l)

        {

            if((mem[I].a[i][l]&mem[I].b[i][l])==(mem[J].a[j][l]&mem[J].b[j][l]))

            continue;

            else

            break;

        }

        if(l==4)

        return true;

    }

    return false;

}

void spfa(int s,int nd,int n)

{

    int dist[N];

    bool in[N];

    int f[N];

    road.clear();

    queue<int>qt;

    memset(in,false,sizeof(in));

    memset(dist,-1,sizeof(dist));

    dist[nd]=0;

    in[nd]=true;

    qt.push(nd);

    while(!qt.empty())

    {

        int x=qt.front();qt.pop();

        in[x]=false;

        for(int t=head[x];t!=-1;t=side[t].next)

        {

            int j=side[t].j;

            if(dist[j]==-1||dist[j]>dist[x]+1)

            {

                dist[j]=dist[x]+1;

                f[j]=x;

                if(!in[j])

                {

                    in[j]=true;

                    qt.push(j);

                }

            }

        }

    }

    if(dist[s]==-1)

    return ;

    int k=s;

    while(k!=nd)

    {

        road.push_back(k);

        k=f[k];

    }

    road.push_back(k);

}

int main()

{

    //freopen("data.in","r",stdin);

    int n;

    while(cin>>n)

    {

        memset(head,-1,sizeof(head));

        I=0;

        for(int i=1;i<=n;++i)

        {

            cin>>mem[i].m;

            char c;

            for(int j=0;j<mem[i].m;++j)

            {

                cin>>mem[i].a[j][0]>>c>>mem[i].a[j][1]>>c>>mem[i].a[j][2]>>c>>mem[i].a[j][3];

                cin>>mem[i].b[j][0]>>c>>mem[i].b[j][1]>>c>>mem[i].b[j][2]>>c>>mem[i].b[j][3];

            }

            for(int l=1;l<i;++l)

            {

                if(equals(i,l))

                {add(i,l),add(l,i);}

            }

        }

        int s,nd;

        cin>>s>>nd;

        spfa(s,nd,n);

        if(road.size()==0)

        cout<<"No"<<endl;

        else

        {

            cout<<"Yes"<<endl;

            for(unsigned int i=0;i<road.size();++i)

            {

                cout<<road[i]<<" ";

            }

            cout<<endl;

        }

    }

    return 0;

}

  

你可能感兴趣的:(out)