zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    算法
    什么叫「人的格局」?是否有必要培养大的格局或怎么培养?
    套接字
    信号量 P V测试详解
    Emacs快速入门
    Emacs 从入门到精通
    Linux多进程之间的文件锁
    mysql 登录报错:ERROR 1045 (28000)
    类职责协作模型
    .Netcore使用Session
  • 原文地址:https://www.cnblogs.com/lzhenf/p/2304152.html
Copyright © 2011-2022 走看看