sicily 1031

 1 #include <iostream>
2 #include <map>
3 #include <vector>
4 #include <string>
5 #include <queue>
6 using namespace std;
7 const int MaxNum = 203;
8 const int MAX = 999999; //定义一个较大的数 , 用于松弛处理
9 //定义距离数组
10 int dis[MaxNum];
11 int n ; //节点的数目 : n+ 1
12 typedef pair<int,int> element;
13 //定义的边
14 struct edge
15 {
16 int des_node ; //指向的节点 ,
17 int weight ; //权重
18 edge( int d , int w)
19 {
20 des_node = d ;
21 weight = w ;
22 }
23 };
24
25 int dijkstra ( int start , int end , vector<edge> G[] )
26 {
27 priority_queue< element , vector<element > , greater<element> > q ; //定义一个优先队列 , greater是最小堆
28 //进行初始化 , 起点为 0 ,其余的为无穷远
29 for ( int i = 0 ; i < n ; i++)
30 dis[i] = ( i == start ? 0 : MAX);
31 //将起点压入队列
32 q.push(make_pair(dis[start],start));
33
34 while(!q.empty())
35 {
36 element u = q.top(); //每次都弹出最小值,再在这最小值基础上修改其它结点的最短距离,就是Dijkstra算法
37 q.pop();
38 //x为哪个点解
39 int x = u.second;
40 //x.first为dis[x]距离
41 for(int i = 0;i < G[x].size() ;++i)// G里存放着邻接表
42 {
43 int y = G[x][i].des_node;
44 int w = G[x][i].weight;
45 //松弛处理
46 if(dis[y] > dis[x] + w)
47 {
48 dis[y] = dis[x] + w;
49 q.push(make_pair(dis[y],y));
50 }
51 }
52 }
53 if(dis[end] == MAX)
54 return -1;
55 else return dis[end];
56 }
57 int main()
58 {
59 int t , NumE , wei ;
60 cin >> t ;
61 string temp1 , temp2 , origin ,destination;
62 while ( t--)
63 {
64 n = 0 ;
65 map<string,int> M; //把每个地址转化成相对应的唯一的数字
66 vector<edge> G[MaxNum];
67 cin >> NumE ;
68 for ( int i = 0 ; i < NumE ; i ++)
69 {
70 cin >> temp1 >> temp2 >> wei;
71 if ( !M.count( temp1))
72 M[temp1] = n++ ;
73 if ( !M.count( temp2 ))
74 M[temp2] = n ++ ;
75 G[M[temp1]].push_back( edge(M[temp2] , wei) );
76 G[M[temp2]].push_back( edge ( M[temp1] , wei ));
77 }
78 cin >> origin >> destination ;
79 if ( origin == destination )
80 cout <<"0"<<endl;
81 else
82 if ( !M.count( origin ) || !M.count( destination ) )
83 cout <<"-1" << endl;
84 else
85 cout << dijkstra( M[ origin ] , M[ destination ] , G ) << endl;
86
87 }
88 return 0 ;
89 }
原文地址:https://www.cnblogs.com/lzhenf/p/2304152.html