【11.13 测试】Walk

 

 

 

 

 

 题解:仍然先奉上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\n",dis[i]);
    }
    return 0;
}

 

posted @ 2019-11-13 14:53  #Cookies#  阅读(92)  评论(0编辑  收藏  举报