http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1004&cid=906
该题关键是把图构出来,但得到邻接矩阵后,想用bfs来搜索,发现超时很严重,于是只能试着用dij来做,居然AC了,嘿嘿~begin from search,end to search……
1
#include <iostream>2
#include <queue>3
#include <math.h>4
using namespace std;5
#define INF 10000000006
int arr[1100][1100];7
int p[1100];8
bool fun(int n,int m)//判断两个数是否只有一位相等9


{10
int same=0,t=4;11
while(t--)12

{13
if(n%10==m%10) same++;14
n/=10;15
m/=10;16
}17
if(same==3) return 1;18
return 0;19
}20
int prime(int n)21


{22
int max=(int)sqrt((double)n)+1;23
int i;24
for (i=3;i<=max;i+=2)25

{26
if(n%i==0)return false;27
}28
return true;29
}30

31
void initprime()32


{33
int i,t=1;34
for(i=1001;i<=9999;i+=2)35

{36
if (prime(i))37

{38
p[t++]=i;39
}40
}41
}42
void getarr()//构建邻接矩阵43


{44
int i,j;45
for (i=1;i<=1061;i++)46

{47
for (j=i+1;j<=1061;j++)48

{49
if (fun(p[i],p[j]))50

{51
arr[i][j]=arr[j][i]=true;52
}53
}54
}55
}56
int getindex(int n)//查找n的索引值57


{58
int i=1,j=1061,mid;59
while(1)60

{61
if(mid!=(i+j)/2)62
mid=(i+j)/2;63
else64

{65
if(p[i]==n)66
return i;67
if(p[j]==n)68
return j;69
}70
if(p[mid]==n)71
return mid;72
if (p[mid]>n)73

{74
j=mid;75
} 76
else77

{78
i=mid;79
}80
}81
}82
// void bfs(int m,int n)83
// {84
// queue<int>coll;85
// queue<int>q;//存储连接的个数86
// int i,index,s=1;87
// bool doit=false;88
// coll.push(m);89
// q.push(s);90
// while(!coll.empty())91
// {92
// index=coll.front();93
// s=q.front();94
// coll.pop();95
// q.pop();96
// for (i=0;i<1061;i++)97
// {98
// if(arr[index][i]==1)99
// {100
// if (i==n)//找到101
// {102
// doit=true;103
// break;104
// }105
// else106
// {107
// coll.push(i);108
// q.push(s+1);109
// }110
// }111
// }112
// if (doit)113
// {114
// break;115
// }116
// }117
// if(doit)118
// printf("%d\n",s);119
// else120
// printf("Impossible\n");121
// }122
int dijkstra(int s, int t, int n)123


{ 124
int i, m[1100]; 125
int v, min_value; 126
int visit[1100]; 127
for(i = 1; i <= n; i ++) 128

{ 129
m[i] = INF; 130
visit[i] = 0; 131
} 132
m[s] = 0; 133
while( 1 ) 134

{ 135
v = -1; min_value = INF; 136
for(i = 1; i <= n; i ++) 137

{ 138

if(visit[i] == 0)
{ 139
if(m[i] < min_value)140

{ 141
min_value = m[i]; 142
v = i; 143
} 144
} 145
} 146
if(v == -1 || v == t)break; 147
visit[v] = 1; 148
for(i = 1; i <= n; i ++) 149

{ 150
if(visit[i] == 0) 151

{ 152
if(m[v] + arr[v][i] < m[i]) 153

{ 154
m[i] = m[v] + arr[v][i];155
156
} 157
} 158
} 159
} 160
return m[t]; 161
}162
int main()163


{164
int n,a,b,x;165
memset(arr,1,sizeof(arr));166
initprime();167
getarr();168
scanf("%d",&n);169
while(n--)170

{171
scanf("%d %d",&a,&b);172
if(a==b)173
printf("0\n");174
else175

{ 176
int i=getindex(a);177
int j=getindex(b);178
x=dijkstra(i,j,1061);179
if(x!=INF)180
printf("%d\n",x);181
else182
printf("Impossible\n");183
}184
}185
return 0;186
}
来源:https://www.cnblogs.com/zpfly/archive/2008/08/10/1264741.html
标签