ZJFC-1236
简单的单源最短路径 使用二叉堆+邻接表+DIJ实现~~~
1
#include<iostream>
2
#include <string>
3
#include <map>
4
#include<queue>
5
using namespace std;
6
7
typedef struct
8
{
9
long v,next,d;
10
}edge;
11
12
typedef struct node
13
{
14
long v,d;
15
node(long vv=0,long dd=0):v(vv),d(dd){}
16
}node;
17
18
bool operator <(const node &a,const node &b)
19
{
20
return a.d>b.d;
21
}
22
23
char from[120],to[120];
24
map<string,long> M;
25
string F,T;
26
27
edge e[200005];
28
long p[10005];
29
bool vist[10005];
30
priority_queue<node> q;
31
32
int main()
33
{
34
long m;
35
while (scanf("%ld",&m)!=EOF)
36
{
37
long i,eid,sid,v1,v2;
38
memset(p,-1,sizeof(p));
39
40
for (eid=sid=i=0;i<m;++i)
41
{
42
long cost;
43
scanf("%s%s%ld",from,to,&cost);
44
45
// F=string(from);
46
// T=string(to);
47
F=from;
48
T=to;
49
50
if ( M.find(F)==M.end() )
51
{
52
v1=M[F]=sid++;
53
}
54
else
55
{
56
v1=M[F];
57
}
58
59
60
if ( M.find(T)==M.end() )
61
{
62
v2=M[T]=sid++;
63
}
64
else
65
{
66
v2=M[T];
67
}
68
69
e[eid].v=v1;
70
e[eid].next=p[v2];
71
e[eid].d=cost;
72
p[v2]=eid++;
73
74
e[eid].v=v2;
75
e[eid].next=p[v1];
76
e[eid].d=cost;
77
p[v1]=eid++;
78
79
}
80
81
scanf("%s%s",from,to);
82
// F=string(from);
83
// T=string(to);
84
F=from;
85
T=to;
86
87
88
if (M.find(T)==M.end()||M.find(F)==M.end())
89
{
90
printf("It's a pity\n");
91
continue;
92
}
93
94
v1=M[F];
95
v2=M[T];
96
97
98
q.push(node(v1,0));
99
100
memset(vist,0,sizeof(vist));
101
102
node t;
103
while (!q.empty())
104
{
105
t=q.top();
106
q.pop();
107
108
if (t.v==v2)
109
{
110
break;
111
}
112
113
if (vist[t.v])
114
{
115
continue;
116
}
117
118
vist[t.v]=true;
119
120
long j;
121
for (j=p[t.v];j!=-1;j=e[j].next)
122
{
123
if (!vist[e[j].v])
124
{
125
q.push(node(e[j].v,e[j].d+t.d));
126
}
127
}
128
}
129
130
if(t.v==v2)
131
{
132
printf("%ld\n",t.d);
133
}
134
else
135
{
136
printf("It's a pity\n");
137
}
138
139
while (!q.empty())
140
{
141
q.pop();
142
}
143
144
M.clear();
145
}
146
return 0;
147
}
148

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

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148
