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; }