1087. All Roads Lead to Rome (30)解题报告
来源:互联网 发布:php .net哪个好 编辑:程序博客网 时间:2024/06/05 06:10
代码
#include <iostream>#include <cstdio>#include <cstdlib>#include <stack>#include <queue>#include <vector>#include <string>#include <functional>#include <map>#define N 220#define INF 1000000using namespace std;bool dijkstra(void);int dfs(int c, int num, int tmp_h, int tmp_cost);int n, k, max_happiness = 0, min_cost = INF, tmp_h = 0;double averg_happy = 0.0;string start;int matrix[N][N], happiness[N] = { 0 };vector<int> v[N];stack<int> path, tmp_path;map<string, int> mp;map<int, string> remp;int main(int argc, const char * argv[]) { cin >> n >> k >> start; string city1, city2; int happy, cost; int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { matrix[i][j] = INF; } } mp[start] = 0; remp[0] = start; for(i = 1; i < n; i++){ cin >> city1 >> happy; mp[city1] = i; happiness[i] = happy; remp[i] = city1; } for(i = 0; i < k; i++){ cin >> city1 >> city2 >> cost; matrix[mp[city1]][mp[city2]] = cost; matrix[mp[city2]][mp[city1]] = cost; } dijkstra(); int dest = mp[string("ROM")]; int cnt; cnt = dfs(dest, 1, 0, 0); printf("%d %d %d %d\n", cnt, min_cost, max_happiness, (int)averg_happy); int tmp = path.top(); path.pop(); cout << remp[tmp]; while(!path.empty()){ tmp = path.top(); path.pop(); cout << "->" << remp[tmp]; } cout << endl; return 0;}bool dijkstra(void){ int i, j, k, min_cost, index = 0, dis[N]; bool isvisited[N]; size_t h1, h2; string c1, c2; for (i = 0; i < n; i++) { dis[i] = INF; isvisited[i] = false; } dis[mp[start]] = 0; for(i = 0; i < n; i++){ min_cost = INF; for(j = 0; j < n; j++){ if (!isvisited[j] && min_cost > dis[j]) { min_cost = dis[j]; index = j; } } isvisited[index] = true; for(j = 0; j < n; j++){ if (!isvisited[j] && dis[index] + matrix[index][j] < dis[j]) { dis[j] = dis[index] + matrix[index][j]; v[j].clear(); v[j].push_back(index); } else if (!isvisited[j] && dis[index] + matrix[index][j] == dis[j]) { v[j].push_back(index); } } } return true;}int dfs(int c, int num, int tmp_h, int tmp_cost){ static int cnt = 0; int i; if (c == 0) { cnt++; tmp_path.push(c); if (tmp_cost < min_cost || (tmp_cost == min_cost && tmp_h > max_happiness) || (tmp_cost == min_cost && tmp_h == max_happiness && (double)tmp_h / (num - 1) > averg_happy)) { path = tmp_path; min_cost = tmp_cost; max_happiness = tmp_h; averg_happy = tmp_h / (num - 1); } tmp_path.pop(); return cnt; } else { tmp_h += happiness[c]; tmp_path.push(c); for (i = 0; i < v[c].size(); i++) { tmp_cost += matrix[c][v[c][i]]; dfs(v[c][i], num + 1, tmp_h, tmp_cost); tmp_cost -= matrix[c][v[c][i]]; } tmp_path.pop(); return cnt; }}
0 0
- 1087. All Roads Lead to Rome (30)解题报告
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- 1087. All Roads Lead to Rome (30)
- VC++6.0 Debug单步调试简单入门
- 用flask开发个人博客(27)—— 利用程序工厂函数创建Flask程序对象并注册蓝本
- Boolean 布尔类型
- Centos中使用Let's Encrypt配置SSL证书
- 提升windows效率的软件
- 1087. All Roads Lead to Rome (30)解题报告
- vc++常用函数方法
- Uiautomator自动化测试编写和调试---小白入门超详细
- 斯坦福大学计算机专业培养方案剖析
- AsyncTask异步任务机制源码分析和总结笔记
- Gradle 构建 android项目及APK打包(ubuntu)
- 仿微信 个人头像修改 popPopupWindow实现Menus从底部弹出
- Qt 状态机框架学习
- ffmpeg命令行批量转换视频