当前位置:   article > 正文

矿大数据结构 实验四_矿大数据结构4

矿大数据结构4

目录

A: 机器人王国里的路径长度

B: 从源点开始的最短路径

C: 最少天数

D: 寻找第二小的数

E: 按十进制各位和排序

F: 奇偶数的排序


A: 机器人王国里的路径长度

如果只有单个的字母则不必用 map ,直接用 char-'A' 存储到普通数组即可。但是本题应该是不全为单个字母,所以需要用 map 存储。由于任一节点只有一个父节点,那么用数组记录每个节点的父节点即可。如果有多个父节点的话就开一个二维的 map 数组

从子节点开始遍历,直到无父节点则代表找到了首都

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. map<string,string> par;
  4. map<string,int> len;
  5. // map <string,map<string,int> >mp //二维map数组
  6. signed main(){
  7. int n;cin>>n;
  8. int m = pow(2,n+1)-2;
  9. for(int i=1;i<=m;i++){
  10. string s1,s2;
  11. int temp;
  12. cin>>s1>>s2>>temp;
  13. par[s2] = s1;
  14. len[s2] = temp;
  15. }
  16. string now;cin>>now;
  17. long long ans = 0; //数据量较大,开long long 会比较稳妥
  18. while(par[now].length()>0){
  19. ans += len[now];
  20. now = par[now];
  21. }
  22. cout<<ans;
  23. return 0;
  24. }

B: 从源点开始的最短路径

Dijkstra 或 floyed 或 dfs 

开一个数组存储步数,不可能成为最优解的直接舍弃

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,m,tar;
  5. int mp[210][210]; //地图
  6. //bool pd[210][210]; //这条路是否走过 |致命错误!同一条路可以重复走
  7. long long l[210]; //源点到该点路径长度
  8. // 到另一个点的步数必须小于之前花的步数
  9. void dfs(int now,int len){
  10. if(l[now]==0||len<l[now])
  11. l[now] = len;
  12. if(now==tar){
  13. return;
  14. }
  15. for(int i=1;i<=n;i++){
  16. if(i==now) continue;
  17. if(mp[now][i] == 0) continue;
  18. if(l[i]>len+mp[now][i]|| l[i]==0)
  19. {
  20. dfs(i,len+mp[now][i]);
  21. }
  22. }
  23. }
  24. signed main(){
  25. cin>>n>>m;
  26. for(int i=1;i<=m;i++){
  27. int x1,x2,x3;
  28. cin>>x1>>x2>>x3;
  29. if(mp[x1][x2]==0||x3<mp[x1][x2]){
  30. mp[x1][x2]=x3;
  31. }
  32. }
  33. cin>>tar;
  34. dfs(1,0);
  35. cout<<l[tar];
  36. return 0;
  37. }

C: 最少天数

  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <queue>
  5. #include <limits>
  6. using namespace std;
  7. // 定义图的边
  8. struct Edge {
  9. char destination;
  10. int weight;
  11. };
  12. // 计算完成工程的最短天数
  13. int calculateShortestTime(const unordered_map<char, vector<Edge>>& graph) {
  14. unordered_map<char, int> inDegree;
  15. unordered_map<char, int> earliestStartTime;
  16. // 统计每个事件的入度
  17. for (const auto& node : graph) {
  18. char currentNode = node.first;
  19. inDegree[currentNode] = 0;
  20. earliestStartTime[currentNode] = -1; // 初始化最早开始时间为-1
  21. }
  22. for (const auto& node : graph) {
  23. char currentNode = node.first;
  24. for (const Edge& edge : node.second) {
  25. char nextNode = edge.destination;
  26. inDegree[nextNode]++;
  27. }
  28. }
  29. // 初始化起点的最早开始时间为0
  30. earliestStartTime['A'] = 0;
  31. // 使用拓扑排序计算每个事件的最早开始时间
  32. queue<char> q;
  33. q.push('A');
  34. while (!q.empty()) {
  35. char currentNode = q.front();
  36. q.pop();
  37. auto it = graph.find(currentNode);
  38. if (it == graph.end()) {
  39. continue;
  40. }
  41. for (const Edge& edge : it->second) {
  42. char nextNode = edge.destination;
  43. int nextStartTime = earliestStartTime[currentNode] + edge.weight;
  44. earliestStartTime[nextNode] = max(earliestStartTime[nextNode], nextStartTime);
  45. if (--inDegree[nextNode] == 0) {
  46. q.push(nextNode);
  47. }
  48. }
  49. }
  50. // 返回工程的最短天数
  51. return earliestStartTime['Z'];
  52. }
  53. int main() {
  54. int N, M;
  55. cin >> N >> M;
  56. unordered_map<char, vector<Edge>> graph;
  57. // 读取子任务信息
  58. for (int i = 0; i < M; ++i) {
  59. char startNode, endNode;
  60. int weight;
  61. cin >> startNode >> endNode >> weight;
  62. graph[startNode].push_back({ endNode, weight });
  63. }
  64. int shortestTime = calculateShortestTime(graph);
  65. cout << shortestTime << endl;
  66. return 0;
  67. }

D: 寻找第二小的数

sort

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,m,tar;
  5. signed main(){
  6. int c;cin>>c;
  7. while(c--){
  8. int n;cin>>n;
  9. int a[110];
  10. for(int i=1;i<=n;i++){
  11. cin>>a[i];
  12. }
  13. sort(a+1,a+n+1);
  14. bool pd = 0;
  15. for(int i=2;i<=n;i++){
  16. if(a[i]!=a[1]){
  17. cout<<a[i]<<endl;
  18. pd = 1;
  19. break;
  20. }
  21. }
  22. if(pd==0) cout<<"NO\n";
  23. }
  24. return 0;
  25. }

E: 按十进制各位和排序

自定义一个cmp,sort

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 1000010;
  5. int a[N];
  6. bool cmp(int m,int n){
  7. int x=m,y=n;
  8. int sm=0,sn=0;
  9. while(m>0){
  10. sm+=m%10;
  11. m/=10;
  12. }
  13. while(n>0){
  14. sn+=n%10;
  15. n/=10;
  16. }
  17. if(sm>sn) return 1;
  18. else if(sm==sn) return x>y;
  19. else return 0;
  20. }
  21. signed main(){
  22. int n;cin>>n;
  23. for(int i=1;i<=n;i++){
  24. cin>>a[i];
  25. }
  26. sort(a+1,a+n+1,cmp);
  27. for(int i=1;i<=n;i++){
  28. cout<<a[i]<<' ';
  29. }
  30. return 0;
  31. }

F: 奇偶数的排序

sort

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 100010;
  5. bool cmp(int m,int n){
  6. return m>n;
  7. }
  8. int n,m,tar;
  9. int a[10010];
  10. int odd[N];
  11. int even[N];
  12. signed main(){
  13. int oi=1,ei=1;
  14. for(int i=1;i<=10;i++){
  15. cin>>a[i];
  16. if(a[i]%2) odd[oi++] = a[i];
  17. else even[ei++] = a[i];
  18. }
  19. sort(odd+1,odd+6,cmp);
  20. for(int i=1;i<=5;i++){
  21. cout<<odd[i]<<' ';
  22. }
  23. sort(even+1,even+6);
  24. for(int i=1;i<=5;i++)cout<<even[i]<<' ';
  25. return 0;
  26. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号