首页 > 代码库 > Sicily 1031. Campus 解题报告
Sicily 1031. Campus 解题报告
1031_Campus
题目链接:
http://soj.me/1031
题目大意:
给出四个校区的一些地点之间的距离,地点名用字符串来表示,问某两个地点之间的最短路径长度,典型的单源最短路径题目
思路:
单源最短路径问题可以用dijkstra算法实现,这道题比较麻烦的是用字符串来表示地点,我用的处理方法是建立map得到地点名字到序号的映射,对于每个新输入的地点名字,先在map里面查找是否存在,如果不存在就绑定一个新的序号.地点之间的距离用邻接矩阵来存放.
代码:
#include <iostream>#include <memory.h>#include <map>#include <queue>#include <vector>using namespace std;const int INF = 100000;int distances[300][300];int shortest[300];bool included[301];map<string, int> m;int numRoads;int numPlaces;string start_name, end_name;void input_and_init();int find_shortest();int find_nearest();int main() { int numTestcases; cin >> numTestcases; while (numTestcases--) { input_and_init(); if(start_name == end_name) cout << 0 << endl; else if(m.count(start_name) == 0 || m.count(end_name) == 0) cout << -1 << endl; else cout << find_shortest() << endl; } return 0;}void input_and_init(){ cin >> numRoads; numPlaces = 0; m.clear(); for (int i = 0; i < 300; ++i) { for (int j = 0; j < 300; ++j) { distances[i][j] = (i == j ? 0 : INF); } } memset(included, false, sizeof(included)); for (int i = 0; i < 300; ++i) { shortest[i] = INF; } string s1, s2; int d; for (int i = 0; i < numRoads; ++i) { cin >> s1 >> s2 >> d; if(m.count(s1) == 0) m[s1] = ++numPlaces; if(m.count(s2) == 0) m[s2] = ++numPlaces; distances[m[s1]][m[s2]] = distances[m[s2]][m[s1]] = d; } cin >> start_name >> end_name;}int find_shortest(){ //Post: 如果起点和终点间有连通则返回最短路径长度,否则返回-1 int start = m[start_name], end = m[end_name]; shortest[start] = 0; for (int i = 0; i < numPlaces; ++i) { int cur = find_nearest(); included[cur] = true; for (int j = 1; j <= numPlaces; ++j) { if(!included[j] && shortest[j] > shortest[cur] + distances[cur][j]){ shortest[j] = shortest[cur] + distances[cur][j]; } } } if(shortest[end] < INF) return shortest[end]; else return -1;}int find_nearest(){ //返回当前离集合S最近的点的下标 int nearest_index = 0; int shortestDistance = INF; for (int i = 1; i <= numPlaces; ++i) { if(shortest[i] < shortestDistance && !included[i]){ nearest_index = i; shortestDistance = shortest[i]; } } return nearest_index;}
Sicily 1031. Campus 解题报告
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。