题解:仍然先奉上40分SPFA的最短路暴力求解算法。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> #include<queue> #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2002; const int M=1000002; const int oo=0x3f3f3f3f; struct node{ int to; int next; }e[M]; int head[N],cnt; int n,m,dis[N],a[N]; bool vis[N]; void add(int x,int y){ e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt; } queue<int>q; void Yao_Chen_spfa(){ memset(dis,0x3f,sizeof(dis)); vis[1]=1; q.push(1); dis[1]=0; while(!q.empty()){ int x=q.front(); q.pop(); vis[x]=0; for(int i=head[x];i;i=e[i].next){ int v=e[i].to; if(dis[v]>dis[x]+1){ dis[v]=dis[x]+1; if(vis[v]==0) { vis[v]=1; q.push(v); } } } } } int x,y; int main(){ freopen("walk.in","r",stdin); freopen("walk.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j && (a[i]&a[j])==a[j]) add(i,j); for(int i=1;i<=m;i++){ scanf("%d %d",&x,&y); add(x,y); } Yao_Chen_spfa(); for(int i=1;i<=n;i++){ if(dis[i]==oo) puts("-1"); else printf("%d ",dis[i]); } return 0; }