1031.Campus 求两个地点的最短路径

/*1031.Campus 求两个地点的最短路径 
  给出一系列的路径,求出给定两个点的路径(这里要特别注意:坑爹的测试数据有
  给出两个相同的存在地点应该要输出0)
  思路:用map把地点string和id对应起来。然后之后就用id来遍历了
        建立vector数组,id是对应地点的id,vector里面装的是一条条边Edge
        然后从其实地点开始放进优先队列,入队的规则是距离源节点进的排在队列头
        这样就保证了一直取出的队头是最短距离 
*/
#include <iostream>
#include <stdlib.h>
#include <map>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#define N 1002

using namespace std;
struct Node
{
   int id;
   int dis;
   Node(){}
   Node(int i, int d) {id = i; dis = d;}
   bool operator<(const Node& b) const
   {
        return dis > b.dis;
   }    
};
       
struct Edge
{
   int id;
   int dis;
   Edge(){}
   Edge(int i, int d) {id = i; dis = d;}
};

map<string,int> placeMap;
int idx, nodeNum;
bool visit[N*2];
vector<Edge> adj[N];

int dijkstra(int start, int end)
{
   memset(visit, false, sizeof(visit));
   priority_queue<Node> pq;
   pq.push(Node(start, 0));
   
   //while(!pq.empty())
   for(int i=1; i<=nodeNum; i++)
   {
       if(pq.empty())
          break;
       Node tmp = pq.top();
       pq.pop();   
       while(visit[tmp.id])
       {
          tmp = pq.top();pq.pop();
       }
       visit[tmp.id] = true;
       if(tmp.id == end)    
          return tmp.dis;
       for(int j=0; j<adj[tmp.id].size(); j++)
       {
              int idd = adj[tmp.id][j].id, dis = adj[tmp.id][j].dis;
              if(!visit[idd])
                pq.push(Node(idd, tmp.dis + dis));        
       }                               
   }
   return -1;  
}


int main()
{
    int testNum, n,distance;
    cin >> testNum;
    string start, end;

    while(testNum--)
    {
       cin >> n;
       idx = 1;
       int startIndex , endIndex;
       placeMap.clear();
       for(int i=0; i<N; i++)
            adj[i].clear();
       for(int i=1; i<=n; i++)
       {
          cin >> start >> end >> distance;
          if(!placeMap.count(start))
            placeMap[start] = idx++;
          if(!placeMap.count(end))
            placeMap[end] = idx++;
          adj[placeMap[start]].push_back(Edge(placeMap[end], distance)); 
          adj[placeMap[end]].push_back(Edge(placeMap[start], distance));         
       }            
       
       cin >> start >> end;
       nodeNum = idx-1;
       //操。都没见过这么扑街的测试数据,就算改点不存在,如果start==end都要输出0 
       if(start == end)
           cout << 0 << endl;
       else if(!placeMap.count(start) || !placeMap.count(end))
           cout << -1 << endl;
          else
         cout << dijkstra(placeMap[start], placeMap[end]) << endl;
    }
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值