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
#include<iostream>2
#include <string>3
#include <map>4
#include<queue>5
using namespace std;6

7
typedef struct8
{9
long v,next,d;10
}edge;11

12
typedef struct node13
{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
else55
{56
v1=M[F];57
}58

59
60
if ( M.find(T)==M.end() )61
{62
v2=M[T]=sid++;63
}64
else65
{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
else135
{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




node(
浙公网安备 33010602011771号