1087. All Roads Lead to Rome (30)
2015-11-23 21:52
232 查看
1.求单源最短路径,使用dijkstra求出最小耗费,以这个最小耗费作为约束条件,在后面遍历的时候进行剪枝
![](http://img.blog.csdn.net/20151123215243714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
AC代码:
AC代码:
//#include<string> //#include <iomanip> //#include<stack> //#include<unordered_set> //#include <sstream> //#include "func.h" //#include <list> #include<unordered_map> #include<set> #include<queue> #include<map> #include<vector> #include <algorithm> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> #include<stack> using namespace std; struct cityNode { vector<pair<string, int>> list; bool visited; bool sured; int happiness; int cost; cityNode() :list(0), visited(false), sured(false), happiness(-1), cost(INT_MAX){}; }; void dfs(string now, int minCost, int nowCost, vector<pair<string, int>>&path, vector<vector<pair<string, int>>>&ans, map<string, bool>&used, map<string, cityNode>&city) { if (now == "ROM"&&nowCost == minCost) { ans.push_back(path); } else if (nowCost > minCost) return; else { for (int i = 0; i < city[now].list.size(); i++) { string q = city[now].list[i].first; if (!used[q]) { used[q] = true; path.push_back({ q, city[q].happiness }); dfs(q, minCost, nowCost + city[now].list[i].second, path, ans, used, city); path.pop_back(); used[q] = false; } } } } bool cmp(const vector<pair<string, int>>&a, const vector<pair<string, int>>&b) { int aHappiness = 0; for (int i = 0; i < a.size(); i++) { aHappiness += a[i].second; } int bHappiness = 0; for (int i = 0; i < b.size(); i++) { bHappiness += b[i].second; } if (aHappiness > bHappiness) return true; else if (aHappiness == bHappiness && aHappiness / a.size() > bHappiness / b.size()) return true; else return false; } int main(void) { int n, k; string src; cin >> n >> k >> src; string target = "ROM"; map<string, cityNode> city; for (int i = 0; i < n - 1; i++) { string str; int happiness; cin >> str >> happiness; city[str].happiness = happiness; } for (int i = 0; i < k; i++) { string a, b; int cost; cin >> a >> b >> cost; city[a].list.push_back({ b, cost }); city[b].list.push_back({ a, cost }); } city[src].visited = true; city[src].cost = 0; while (1) { string p = ""; for (map<string, cityNode>::iterator ite = city.begin(); ite != city.end(); ite++) { if (p == ""&&ite->second.visited&&!ite->second.sured) p = ite->first; else if (p != ""&&ite->second.visited&&!ite->second.sured&& ite->second.cost < city[p].cost) p = ite->first; } if (p == "") break; city[p].sured = true; if (city[target].sured) break; for (int i = 0; i < city[p].list.size(); i++) { string q = city[p].list[i].first; if (!city[q].sured&&city[p].cost + city[p].list[i].second < city[q].cost) { city[q].visited = true; city[q].cost = city[p].cost + city[p].list[i].second; } } } int minCost = city[target].cost; map<string, bool> used; vector<pair<string, int>>path; vector<vector<pair<string, int>>>ans; dfs(src, minCost, 0, path, ans, used, city); sort(ans.begin(), ans.end(), cmp); int totalHappiness = 0; int avgHappiness = 0; for (int i = 0; i < ans[0].size(); i++) { totalHappiness += ans[0][i].second; } avgHappiness = totalHappiness / ans[0].size(); printf("%d %d %d %d\n", ans.size(), minCost, totalHappiness, avgHappiness); cout << src << "->"; for (int i = 0; i < ans[0].size(); i++) { cout << ans[0][i].first; if (i != ans[0].size() - 1) cout << "->"; } cout << endl; return 0; }
相关文章推荐
- 标记文件
- Linux Advance--目录下文件类型统计
- 网站开发进阶(十七)Html元素隐藏的几种方式
- 1087. All Roads Lead to Rome (30)
- POJ1088(记忆化搜索)
- 网络基础之网络参考模型 + 网络协议
- Redhat编译php-5.2.9出现error dereferencing pointer to incomplete type
- 一张图简单了解HTML5
- UUID&UDID区别
- 11个让你吃惊的 Linux 终端命令
- 三色排序问题/(荷兰国旗问题)(C++版)
- hdu3450
- C# 扩展方法
- 多线程-GCD3
- 1018. Public Bike Management (30)
- 南大软院大神养成计划第八天
- 浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
- hdu 3617 Happy 2009
- 初识设备控制器
- Codeforces 527D Clique Problem