• Prime Path[POJ3126] [SPFA/BFS]


    描述

    孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了。zydsg要做些改变,他想去和素数小姐姐约会。
    所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样,如果两个路口间只差1个数字,则有一条路连通两个路口。(例如1033和1073间有一条路连接)
    现在,你知道了zydsg的位置和素数小姐姐的家,问最少zydsg要走多少条路才能见到素数小姐姐。例如:如果zydsg在1033,素数小姐姐的家在8179,最少要走6条街,走法为:

    1033
    1733
    3733
    3739
    3779
    8779
    8179

    Input
    输入数据有多组,首先是一个数字n,代表之后有n组数据。 其次,在每一组输入中,都包含两个数字a和b,代表zydsg的位置和素数小姐姐家的位置。 其中,a和b都是四位数,而且不含前导0。
    Output
    每组输入输出一行,表示zydsg最少需要走多少条路。若不存在合法的路径,则输出单词“Impossible”。Sample Input
    3
    1033 8179
    1373 8017
    1033 1033
    Sample Output
    6
    7
    0

    分析

    首先我们要筛素数,接下来

    方法一:

    两个“相邻的”素数连边,每次从开头向终点跑SPFA

    方法二:

    按个十百千位向四周扩散,BFS

    代码(SPFA)

     1 #include<set>
     2 #include<map>
     3 #include<queue>
     4 #include<stack>
     5 #include<cmath>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<iostream>
     9 #include<algorithm>
    10 #define RG register int
    11 #define rep(i,a,b)    for(RG i=a;i<=b;++i)
    12 #define per(i,a,b)    for(RG i=a;i>=b;--i)
    13 #define ll long long
    14 #define inf (1<<29)
    15 #define maxn 10005
    16 #define lim 10002
    17 #define maxm 1500005
    18 #define add(x,y) e[++ct]=(E){y,head[x]},head[x]=ct
    19 using namespace std;
    20 int n,m,cnt,ct;
    21 int isp[maxn],p[maxn],head[maxn],dis[maxn],vis[maxn],id[maxn];
    22 struct E{
    23     int v,next;
    24 }e[maxm];
    25 inline int read()
    26 {
    27     int x=0,f=1;char c=getchar();
    28     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    29     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    30     return x*f;
    31 }
    32 
    33 inline int judge(int x,int y)
    34 {
    35     int sum=0;
    36     while(x)    {if(x%10!=y%10)    sum++;x/=10,y/=10;}
    37     return sum==1;
    38 }
    39 
    40 void pre()
    41 {
    42     rep(i,2,lim)
    43     {
    44         if(!isp[i])    p[++cnt]=i,id[i]=cnt;
    45         for(RG j=1;j<=cnt&&p[j]*i<=lim;j++)
    46         {
    47             isp[i*p[j]]=1;
    48             if(!(i%p[j]))    break;
    49         }
    50     }
    51     rep(i,169,cnt)    rep(j,i+1,cnt)    if(judge(p[i],p[j])) add(i,j),add(j,i);
    52 }
    53 
    54 int SPFA(int S,int T)
    55 {
    56     memset(dis,63,sizeof(dis));dis[S]=0;
    57     queue<int> que;que.push(S);
    58     RG u,v;
    59     while(!que.empty())
    60     {
    61         u=que.front(),que.pop(),vis[u]=0;
    62         for(RG i=head[u];i;i=e[i].next)
    63         {
    64             v=e[i].v;
    65             if(dis[v]>dis[u]+1){
    66                 dis[v]=dis[u]+1;
    67                 if(!vis[v])    vis[v]=1,que.push(v);
    68             }
    69         }
    70     }
    71     return dis[T];
    72 }
    73 
    74 int main()
    75 {
    76     int Tim=read();
    77     pre();
    78     while(Tim--)
    79     {
    80         scanf("%d%d",&n,&m);
    81         printf("%d
    ",SPFA(id[n],id[m]));
    82     }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    Python全栈 MySQL 数据库 (表字段增、删、改、查、函数)
    Python全栈 MySQL 数据库 (简述 、安装、基本命令)
    Python全栈工程师(异常(高级)、运算符重载)
    Python全栈工程师(多继承、函数重写)
    【洛谷P3796】(模板)AC自动机(加强版)
    【洛谷P3808】(模板)AC自动机(简单版)
    【洛谷P3919】(模板)可持久化数组(可持久化线段树/平衡树)
    【洛谷P3834】(模板)可持久化线段树 1(主席树)
    【洛谷P3369】(模板)普通平衡树
    [USACO12FEB]牛券Cow Coupons
  • 原文地址:https://www.cnblogs.com/ibilllee/p/9244052.html
Copyright © 2020-2023  润新知