pku 2394
2009年7月25日
題目鏈接:PKU 2394 Checking an Alibi
分類:最短路
題目分析與算法原型
其他沒什么,就是需要注意重邊的處理,Dijkastra就行了
Code:
1
#include<stdio.h>
2
#include<string.h>
3
#define len 505
4
#define max 0x7fffffff
5
6
int f,p,c,m,i,j,map[len][len],dis[len],flag[len],cow[len],u,res[len],pos;
7
8
void init()
9

{
10
for(i=1;i<=f;i++)
11
for(j=1;j<=f;j++)
12
{
13
if(i==j)map[i][j]=0;
14
else map[i][j]=max;
15
}
16
}
17
18
void dij(int v0)
19

{
20
for(i=1;i<=f;i++)dis[i]=map[v0][i];
21
flag[v0]=1;
22
for(i=1;i<f;i++)
23
{
24
int min=max;
25
for(j=1;j<=f;j++)
26
if(flag[j]==0&&dis[j]<min)
27
{
28
u=j;
29
min=dis[j];
30
}
31
if(min==max)return ;
32
flag[u]=1;
33
for(j=1;j<=f;j++)
34
if(flag[j]==0&&map[u][j]<max&&dis[u]+map[u][j]<dis[j])
35
dis[j]=dis[u]+map[u][j];
36
}
37
}
38
39
int main()
40

{
41
while(scanf("%d%d%d%d",&f,&p,&c,&m)!=EOF)
42
{
43
init();
44
memset(flag,0,sizeof(flag));
45
int a,b,cost;
46
for(i=1;i<=p;i++)
47
{
48
scanf("%d%d%d",&a,&b,&cost);
49
if(cost<map[a][b])
50
{
51
map[a][b]=cost;
52
map[b][a]=cost;
53
}
54
}
55
for(i=1;i<=c;i++)
56
{
57
int num;
58
scanf("%d",&num);
59
cow[i]=num;
60
}
61
dij(1);
62
pos=0;
63
for(i=1;i<=c;i++)
64
if(dis[cow[i]]<=m)res[pos++]=i;
65
66
printf("%d\n",pos);
67
for(i=0;i<pos;i++)printf("%d\n",res[i]);
68
}
69
return 0;
70
}
71
題目鏈接:PKU 2394 Checking an Alibi
分類:最短路
題目分析與算法原型
其他沒什么,就是需要注意重邊的處理,Dijkastra就行了
Code:
1

2

3

4

5

6

7

8

9



10

11

12



13

14

15

16

17

18

19



20

21

22

23



24

25

26

27



28

29

30

31

32

33

34

35

36

37

38

39

40



41

42



43

44

45

46

47



48

49

50



51

52

53

54

55

56



57

58

59

60

61

62

63

64

65

66

67

68

69

70

71
