/*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;
}
1031.Campus 求两个地点的最短路径
最新推荐文章于 2022-09-24 14:03:02 发布