make_pair的用法以及替代make_pair的结构体以及广度优先搜索

本文介绍了如何在K-ary树中找到一个杀手Chandan追捕亡命之徒Arjit的最大距离,并计算相应的旅行成本。Chandan需要解决的问题是在一棵K-ary树中,从初始位置出发,沿着Arjit留下的足迹找到他可能到达的最远位置。题目给出了不同距离范围内的旅行成本计算方式,并提供了输入输出格式以及解题方法,包括使用结构体代替`make_pair`来处理问题。
摘要由CSDN通过智能技术生成

中文题意:就是一个杀手要追上一个亡命之徒要走多远以及为此付出的代价。

Agitated Chandan
Attempted by:  1308
/
Accuracy:  83%
/
Maximum Score:  20
/
</
好的,我会为你解答这个问题。 首先,我们需要定义一个表示邻接矩阵的结构体,包括结点数量和邻接矩阵本身: ```cpp const int MAXN = 100; struct Graph { int n; int mat[MAXN][MAXN]; }; ``` 接下来,我们需要实现深度优先遍历和广度优先遍历。这两种遍历算法可以使用递归和队列来实现。这里我们分别定义两个函数 `dfs` 和 `bfs`: ```cpp bool vis[MAXN]; // 标记每个点是否已经遍历过 // 深度优先遍历 void dfs(Graph g, int u) { vis[u] = true; cout << u << " "; // 输出遍历顺序 for (int v = 0; v < g.n; v++) { if (g.mat[u][v] && !vis[v]) { dfs(g, v); } } } // 广度优先遍历 void bfs(Graph g, int u) { queue<int> q; q.push(u); vis[u] = true; while (!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; // 输出遍历顺序 for (int v = 0; v < g.n; v++) { if (g.mat[u][v] && !vis[v]) { q.push(v); vis[v] = true; } } } } ``` 最后,我们需要实现求最短路径的函数 `shortest_path`。这个函数可以使用 Dijkstra 算法或者 Floyd-Warshall 算法来实现。这里我们使用 Dijkstra 算法,同时也需要定义一个结构体 `Node` 来表示每个结点: ```cpp struct Node { int d; // 到源点的距离 int p; // 前驱结点 }; // Dijkstra 算法求最短路径 void shortest_path(Graph g, int s) { Node nodes[MAXN]; for (int i = 0; i < g.n; i++) { nodes[i].d = INT_MAX; nodes[i].p = -1; } nodes[s].d = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push(make_pair(0, s)); while (!pq.empty()) { pair<int, int> top = pq.top(); pq.pop(); int u = top.second; if (nodes[u].d < top.first) continue; for (int v = 0; v < g.n; v++) { if (g.mat[u][v] && nodes[v].d > nodes[u].d + g.mat[u][v]) { nodes[v].d = nodes[u].d + g.mat[u][v]; nodes[v].p = u; pq.push(make_pair(nodes[v].d, v)); } } } for (int i = 0; i < g.n; i++) { if (nodes[i].p != -1) { cout << "Shortest path from " << s << " to " << i << " is: "; int j = i; stack<int> st; while (j != -1) { st.push(j); j = nodes[j].p; } while (!st.empty()) { cout << st.top() << " "; st.pop(); } cout << "with distance " << nodes[i].d << endl; } } } ``` 完整的代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值