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>
4using namespace std;
5#define INF 1000000000
6int arr[1100][1100];
7int p[1100];
8bool 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;
18return 0;
19}
20int 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
31void 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}
42void 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}
56int 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// }
122int 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}
162int 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
标签