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 ...
随机推荐
- 题解 CF504E 【Misha and LCP on Tree】
PullShit 倍增和树剖的差距!!! 一个 TLE, 一个 luogu 最优解第三!!! 放个对比图(上面倍增,下面轻重链剖分): 不过这是两只 log 非正解... Solution \(LCP ...
- Acwing 405. 将他们分好队
大型补档计划 题目链接 看到分成两组,想到二分图判定 + 染色. 二分图的特点是两个有矛盾的点连一条边,考虑在这道题中,如果 \(a, b\) 中有一个人不认识对方(或者两个人互不认识),就不可能分在 ...
- C++异常之五 异常和继承
异常和继承 异常也是类,我们可以创建自己的异常类,在异常中可以使用(虚函数,派生,引用传递和数据成员等), 下面用一个自制的数组容器Vector,在对Vector初始化时来对Vector的元素个数进行 ...
- 【Jmeter 常用方法】
https://www.jianshu.com/p/a4922b0dceba 如果if控制器的使用
- redis 存储验证码 基本使用
1 redis 存储验证码 基本使用 1.1 setting 配置 CACHES = { "default": { "BACKEND": "djang ...
- django 初始化项目 和modelviewset 使用
django初始化项目 1.初始化项目结构└─shiyanlou_project │ .gitignore│ README.en.md # 英文│ README.md # 中文项目简介│├─celer ...
- ubuntu 18 安装xgboost GPU版本
综合上述两个帖子: https://www.cnblogs.com/huadongw/p/6161145.html https://blog.csdn.net/u011587516/article/d ...
- java.net.BindException:Problem binding to [hostname:8088]地址已在使用
异常提示端口号被占用 查找被占用的端口 netstat -tln netstat -tln | grep 8083 netstat -tln ## 查看端口使用情况,而netstat -tln | g ...
- 多个HDFS集群的fs.defaultFS配置一样,造成应用一直连接同一个集群的问题分析
背景 应用需要对两个集群中的同一目录下的HDFS文件个数和文件总大小进行比对,在测试环境中发现,即使两边HDFS目录下的数据不一样,应用日志显示两边始终比对一致,分下下来发现,应用连的一直是同一个集群 ...
- 06-flask-文件上传案例
前端代码 Demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...