http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1004&cid=906
该题关键是把图构出来,但得到邻接矩阵后,想用bfs来搜索,发现超时很严重,于是只能试着用dij来做,居然AC了,嘿嘿~begin from search,end to search……

Code
1
#include <iostream>
2
#include <queue>
3
#include <math.h>
4
using namespace std;
5
#define INF 1000000000
6
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
else
64
{
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
else
77
{
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
// else
106
// {
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
// else
120
// 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
else
175
{
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
else
182
printf("Impossible\n");
183
}
184
}
185
return 0;
186
}
来源:https://www.cnblogs.com/zpfly/archive/2008/08/10/1264741.html