朴素的dijkstra算法,临街表实现
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<algorithm>
5 #define Max 0x7FFFffff
6 using namespace std;
7 int a[505][505],dist[505];
8 void dij(int n)
9 {
10 int i,j,s[505],neww;
11 for(i=1;i<=n;i++)
12 {
13 dist[i]=a[1][i];
14 s[i]=1;
15 }
16 dist[1]=0;
17 s[1]=0;
18 for(i=0;i<n-1;i++)
19 {
20 int temp=Max;
21 int u=1;
22 for(j=1;j<=n;j++)
23 if(s[j]==1&&dist[j]<temp)
24 {
25 u=j;
26 temp=dist[j];
27 }
28
29 s[u]=0;
30 for(int j=1;j<=n;j++)
31 if(s[j]==1&&a[u][j]<Max)
32 {
33 neww=dist[u]+a[u][j];
34 if(neww<dist[j])
35 dist[j]=neww;
36
37 }
38 }
39
40 }
41 int main()
42 {
43 int n,m,i,j,x,y,min,p,z,res[505],l;
44 scanf("%d %d %d %d",&n,&m,&p,&l);
45 memset(a,0,sizeof(a));
46 memset(dist,0,sizeof(dist));
47 memset(res,0,sizeof(res));
48 for(i=1;i<=n;i++)
49 for(j=1;j<=n;j++)
50 {
51 a[i][j]=Max;
52 if(i==j)
53 a[i][j]=0;
54 }
55 while(m--)
56 {
57 scanf("%d %d %d",&x,&y,&z);
58 if(z<a[x][y])
59 a[x][y]=a[y][x]=z;
60 }
61 dij(n);
62 int count=0;i=0;
63 for(j=1;j<=p;j++)
64 {
65 scanf("%d",&x);
66 if(dist[x]<=l)
67 {
68 res[i++]=j;
69 count++;
70 }
71
72 }
73 printf("%d\n",count);
74 for(j=0;j<i;j++)
75 {
76 printf("%d\n",res[j]);
77 }
78 return 0;
79
80
81
82 }
83
浙公网安备 33010602011771号