第一行n和m,表示n个顶点和m条边。(n<=100) 接下来是m行,每行三个整数表示一条边的两个顶点、长度(小于100)。 输出 若干行,每行是第一个数是1,最后第二个是n,最后一个是从起点到终点的长度。 如果从1到n没有通路,则输出-1。注意:每一条边最多只能走一次。 样例 输入 复制 3 3 1 2 3 1 3 4 2 3 3 输出 复制 1 2 3 6 1 3 4 提示 样例说明:1到3的路径 有: 1—>2—> 3 路径长度是 6 1—>3 路径长度是 4 用C++写
时间: 2024-04-09 19:33:07 浏览: 135
tt.rar_M?n_无向图环_无向连通图 最小生成树_连通图
对于给定的n个顶点和m条边,我们可以使用图的深度优先搜索(DFS)来找到从起点1到终点n的路径。
首先,我们需要创建一个邻接矩阵来表示图的连接关系和边的长度。初始化邻接矩阵为无穷大(表示不可达)。
然后,根据输入的m条边,更新邻接矩阵中对应的位置为边的长度。
接下来,我们可以定义一个递归函数来执行深度优先搜索。该函数将当前顶点、当前路径长度和已访问顶点的集合作为参数。
在每一步递归中,我们将当前顶点添加到已访问的集合中,并遍历所有未访问过的相邻顶点。对于每个相邻顶点,如果它不在已访问的集合中,我们将继续递归地调用该函数。在递归调用之后,我们需要将当前顶点从已访问的集合中移除。
当我们到达终点n时,我们可以将路径长度和路径输出。
最后,我们可以在主函数中调用深度优先搜索函数,并根据需要输出结果。
以下是C++代码的实现:
```cpp
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
const int INF = INT_MAX;
void dfs(vector<vector<int>>& graph, vector<bool>& visited, int cur, int dest, int curLen, int& minLen) {
if (cur == dest) {
minLen = min(minLen, curLen);
return;
}
visited[cur] = true;
for (int i = 0; i < graph[cur].size(); ++i) {
int next = graph[cur][i];
if (!visited[next]) {
dfs(graph, visited, next, dest, curLen + graph[cur][next], minLen);
}
}
visited[cur] = false;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n + 1, vector<int>(n + 1, INF));
for (int i = 0; i < m; ++i) {
int u, v, len;
cin >> u >> v >> len;
graph[u][v] = len;
graph[v][u] = len;
}
vector<bool> visited(n + 1, false);
int minLen = INF;
dfs(graph, visited, 1, n, 0, minLen);
if (minLen == INF) {
cout << -1 << endl;
} else {
cout << 1 << " " << n << " " << minLen << endl;
}
return 0;
}
```
注意:以上代码只是一个示例实现,可能需要根据具体需求进行修改。另外,为了简化示例,没有包含输入数据的合法性检查和错误处理。在实际应用中,应该对输入进行适当的验证和处理。
阅读全文