PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra
题目分析:
这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑
这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的所有的城市的名称都是字符串(三个大写字母),所以我先将每个字符串计算一个hash值去代表每一个城市,接着就是用dijkstra算法去逐步判断各种情况,是直接用了一个dijkstra去计算,而没有说是先dijkstra算出最短距离再dfs所有的路径去找出最优解,因为我觉得这题局部最优就能反映到全局最优,也不知是不是想错了才在牛客上有一个点过不去QAQ...
本题代码:
1 #include<iostream>
2 #include<vector>
3 #include<stdio.h>
4 #include<string.h>
5 #include<cmath>
6 #include<string>
7 #include<algorithm>
8 #include<map>
9 using namespace std;
10
11 const int N = 3000;
12 const int M = 0x3f3f3f3f;
13 int mat[N][N];
14 int dist[N];
15 int vis[N];
16 int hap[N];
17 int get_hap[N]; //已知情况下到i点能获得的幸福值
18 int way[N]; //到达每个点有多少种走法
19 int num[N]; //到达i点需要走多少个点 第一个sta不算
20 vector<int> v[N];
21 int pre[N];
22 map<int, string> mp;
23 int n, m, min_dist, max_hap;
24
25 int trans(string s){
26 int len = s.size();
27 int sum = 0;
28 for(int i = 0; i < len; i++){
29 sum = sum * 10 + s[i] - 'A';
30 }
31 return sum;
32 }
33
34 int minn(){
35 int Min = M;
36 int k = -1;
37 for(int i = 0; i < 3000; i++){
38 if(vis[i] == 0 && dist[i] < Min){
39 Min = dist[i];
40 k = i;
41 }
42 }
43 return k;
44 }
45
46 void out(int x){
47 if(pre[x] == -1){
48 cout<<mp[x];
49 return;
50 }else{
51 out(pre[x]);
52 cout<<"->"<<mp[x];
53 return;
54 }
55 }
56
57 void dijkstra(int st){
58 memset(dist, M, sizeof(dist));
59 for(int i = 0; i < v[st].size(); i++) dist[v[st][i]] = mat[st][v[st][i]];
60 dist[st] = 0; //保证自己先选自己
61 way[st] = 1; //到自己有一条路
62 pre[st] = -1;
63 for(int i = 1; i <= n; i++){
64 int k = minn();
65 if(k == -1) break;
66 vis[k] = 1;
67 for(int j = 0; j < 3000; j++){
68 if(vis[j] == 0 && dist[k] + mat[k][j] < dist[j]){
69 dist[j] = dist[k] + mat[k][j];
70 get_hap[j] = hap[j] + get_hap[k];
71 pre[j] = k;
72 way[j] = way[k];
73 num[j] = num[k] + 1;
74 }else if(vis[j] == 0 && dist[k] + mat[k][j] == dist[j]){
75 way[j] = way[j] + way[k];
76 if(get_hap[k] + hap[j] > get_hap[j]){ //距离相同但是更快乐
77 get_hap[j] = get_hap[k] + hap[j];
78 pre[j] = k;
79 num[j] = num[k] + 1;
80 }else if(get_hap[k] + hap[j] == get_hap[j]){//距离相同且同样快乐则比较点的个数
81 if(num[k] + 1 < num[j]){ //点更少
82 pre[j] = k;
83 num[j] = num[k] + 1;
84 }
85 }
86 }
87 }
88 }
89 int en = trans("ROM");
90 printf("%d %d %d %d\n", way[en], dist[en], get_hap[en], get_hap[en]/num[en]);
91 out(en);
92 printf("\n");
93 }
94
95 int main(){
96 scanf("%d%d", &n, &m);
97 string sta;
98 cin>>sta;
99 int st = trans(sta);
100 mp[st] = sta;
101 memset(vis, 0, sizeof(vis));
102 memset(hap, 0, sizeof(hap));
103 memset(mat, M, sizeof(mat));
104 memset(num, 0, sizeof(num));
105 memset(get_hap, 0, sizeof(get_hap));
106 memset(way, 0, sizeof(way));
107 for(int i = 1; i < n; i++){
108 string s;
109 cin>>s;
110 int tt = trans(s);
111 mp[tt] = s;
112 int x;
113 scanf("%d", &x);
114 hap[tt] = x; //根据hash值锁定幸福值
115 }
116 for(int i = 1; i <= m; i++){
117 string s1, s2; int x;
118 cin>>s1>>s2; scanf("%d", &x);
119 int t1 = trans(s1);
120 int t2 = trans(s2);
121 v[t1].push_back(t2);
122 v[t2].push_back(t1);
123 mat[t1][t2] = x;
124 mat[t2][t1] = x;
125 }
126 dijkstra(st);
127 return 0;
128 }
PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra的更多相关文章
- 【PAT甲级】1087 All Roads Lead to Rome (30 分)(dijkstra+dfs或dijkstra+记录路径)
题意: 输入两个正整数N和K(2<=N<=200),代表城市的数量和道路的数量.接着输入起点城市的名称(所有城市的名字均用三个大写字母表示),接着输入N-1行每行包括一个城市的名字和到达该 ...
- PAT (Advanced Level) 1087. All Roads Lead to Rome (30)
暴力DFS. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- [图的遍历&多标准] 1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...
- 1087. All Roads Lead to Rome (30)
时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Indeed there are many different ...
- 1087 All Roads Lead to Rome (30)(30 分)
Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- pat1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT甲级1087. All Roads Lead to Rome
PAT甲级1087. All Roads Lead to Rome 题意: 确实有从我们这个城市到罗马的不同的旅游线路.您应该以最低的成本找到您的客户的路线,同时获得最大的幸福. 输入规格: 每个输入 ...
- PAT 1087 All Roads Lead to Rome
PAT 1087 All Roads Lead to Rome 题目: Indeed there are many different tourist routes from our city to ...
随机推荐
- NOI 2020 D1T3 本人题解
我看了出题人本题的做法,感觉很难写,就自己胡了一个\(O((n + m) \sqrt n)\)的做法. 第一步我的想法与出题人一样,都是考虑容斥降维.对第\(i\)组询问,我们枚举两个事件中较大的一个 ...
- Java IO源码分析(二)——ByteArrayInputStream 和 ByteArrayOutputStream
简介 ByteArrayInputStream 是字节数组输入流,它继承于InputStream. 它的内部数据存储结构就是字节数组. ByteArrayOutputStream是字节数组输出流,它继 ...
- JAVA获取指定的类型的本机MAC地址
前面我们运维小伙在部署的时候,发现在真实服务器获取不到mac地址或者获取不到指定类型的mac地址,写程序记录如下 import com.google.common.base.Strings; impo ...
- day108:MoFang:首页检测用户是否登录&在项目中使用MongoDB&用户页面更新用户信息&交易密码界面实现
目录 1.首页页面也要检测用户是否登录 2.在flask中使用MongoDB 3.用户页面更新用户信息 4.交易密码界面/密码修改界面/昵称修改界面初始化 5.交易密码实现 1.首页页面也要检测用户是 ...
- react项目中的一些配置
react中事件优化使用babel插件 npm install babel-plugin-react-scope-binding --save-dev react中绝对路径引入文件:在根目录下增加js ...
- 从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)
环境介绍 资源 说明 centos v7.2 docker 快速部署项目环境 nginx 反向代理,同时配置https证书 halo v1.4.2,开源博客项目 Let's Encrypt 免费证书 ...
- 《Stereo R-CNN based 3D Object Detection for Autonomous Driving》论文解读
论文链接:https://arxiv.org/pdf/1902.09738v2.pdf 这两个月忙着做实验 博客都有些荒废了,写篇用于3D检测的论文解读吧,有理解错误的地方,烦请有心人指正). 博客原 ...
- js下 Day12、案例
一.垃圾分类 效果图: 功能思路分析: 1. 鼠标按下 (1) 获取鼠标到元素的距离(e.offsetX) (2) 开启开关变量 (3) 获取事件源 (4) 记录垃圾初始位置 2. 鼠标移动 ( ...
- Spring笔记(9) - IOC实现方式详解
IOC概念 控制反转(Inversion of Control,IOC),是面向对象编程中的一种设计原则,它建议将不需要的职责移出类,让类专注于核心职责,从而提供松散耦合,提高优化软件程序设计.它把传 ...
- 精尽Spring MVC源码分析 - HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...