以下代码用C语言实现。 某国有n个城市和m条单向火车,可能存在重边和自环,所有火车费用均为正值(1到1000)。请你求出1号城市到n号城市的最少费用,如果无法从1号城市走到n号城市,则输出-1。 输入:第一行包含整数n和m。(1<=n<=500, 1<=m<100000)接下来m行每行包含三个整数x,y,z,表示存在一条从城市x到城市y的火车,价格为z。 输出:输出一个整数,表示1号城市到n号城市的最少费用。如果路径不存在,则输出-1
时间: 2024-03-02 12:48:45 浏览: 103
以下是一个基于Dijkstra算法的C语言实现,可以解决这个问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_N 500
#define MAX_M 100000
struct Edge {
int to, cost;
struct Edge *next;
};
struct Graph {
struct Edge *adj[MAX_N + 1];
} g;
int n, m;
int dist[MAX_N + 1];
int visited[MAX_N + 1];
void add_edge(int from, int to, int cost) {
struct Edge *e = malloc(sizeof(struct Edge));
e->to = to;
e->cost = cost;
e->next = g.adj[from];
g.adj[from] = e;
}
void dijkstra() {
for (int i = 1; i <= n; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
dist[1] = 0;
for (int i = 1; i <= n; i++) {
int u = 0;
for (int j = 1; j <= n; j++) {
if (!visited[j] && (u == 0 || dist[j] < dist[u])) {
u = j;
}
}
if (u == n) {
break;
}
visited[u] = 1;
for (struct Edge *e = g.adj[u]; e != NULL; e = e->next) {
int v = e->to;
int cost = e->cost;
if (!visited[v] && dist[u] != INT_MAX && dist[u] + cost < dist[v]) {
dist[v] = dist[u] + cost;
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
add_edge(x, y, z);
}
dijkstra();
if (dist[n] == INT_MAX) {
printf("-1\n");
} else {
printf("%d\n", dist[n]);
}
return 0;
}
```
该程序的时间复杂度为O(n^2),适用于较小的n和m。如果n和m比较大,可以使用堆优化的Dijkstra算法来加速程序。
阅读全文