ZJFC-1236
简单的单源最短路径 使用二叉堆+邻接表+DIJ实现~~~
1#include<iostream>
2#include <string>
3#include <map>
4#include<queue>
5using namespace std;
6
7typedef struct
8{
9 long v,next,d;
10}edge;
11
12typedef struct node
13{
14 long v,d;
15 node(long vv=0,long dd=0):v(vv),d(dd){}
16}node;
17
18bool operator <(const node &a,const node &b)
19{
20 return a.d>b.d;
21}
22
23char from[120],to[120];
24map<string,long> M;
25string F,T;
26
27edge e[200005];
28long p[10005];
29bool vist[10005];
30priority_queue<node> q;
31
32int 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#include <string>
3#include <map>
4#include<queue>
5using namespace std;
6
7typedef struct
8{
9 long v,next,d;
10}edge;
11
12typedef struct node
13{
14 long v,d;
15 node(long vv=0,long dd=0):v(vv),d(dd){}
16}node;
17
18bool operator <(const node &a,const node &b)
19{
20 return a.d>b.d;
21}
22
23char from[120],to[120];
24map<string,long> M;
25string F,T;
26
27edge e[200005];
28long p[10005];
29bool vist[10005];
30priority_queue<node> q;
31
32int 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