c语言编写代码:Description 某国有n个城市和m条单向火车,可能存在重边和自环,所有火车费用均为正值。(1-1000) 请你求出1号城市到n号城市的最少费用,如果无法从1号城市走到n号城市,则输出−1。 Input 第一行包含整数n和m。(1<=n<=500, 1<=m<100000) 接下来m行每行包含三个整数x,y,z,表示存在一条从城市x到城市y的火车,价格为z。 Output 输出一个整数,表示1号城市到n号城市的最少费用。 如果路径不存在,则输出-1
时间: 2024-03-03 14:53:10 浏览: 67
以下是使用 Dijkstra 算法解决该问题的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAXN 500
#define MAXM 100000
struct Edge {
int v, w;
struct Edge *next;
};
struct Vertex {
struct Edge *head;
int dist;
int visited;
};
struct Graph {
struct Vertex vertex[MAXN+1];
struct Edge edge[MAXM];
int edge_count;
};
void add_edge(struct Graph *g, int u, int v, int w) {
struct Edge *e = &g->edge[g->edge_count++];
e->v = v;
e->w = w;
e->next = g->vertex[u].head;
g->vertex[u].head = e;
}
int dijkstra(struct Graph *g, int s, int t) {
int i;
for (i = 1; i <= MAXN; i++) {
g->vertex[i].dist = INT_MAX;
g->vertex[i].visited = 0;
}
g->vertex[s].dist = 0;
while (!g->vertex[t].visited) {
int u = 0, min_dist = INT_MAX;
for (i = 1; i <= MAXN; i++) {
if (!g->vertex[i].visited && g->vertex[i].dist < min_dist) {
u = i;
min_dist = g->vertex[i].dist;
}
}
if (u == 0) {
break;
}
g->vertex[u].visited = 1;
struct Edge *e;
for (e = g->vertex[u].head; e != NULL; e = e->next) {
int v = e->v, w = e->w;
if (!g->vertex[v].visited && g->vertex[u].dist + w < g->vertex[v].dist) {
g->vertex[v].dist = g->vertex[u].dist + w;
}
}
}
return g->vertex[t].dist == INT_MAX ? -1 : g->vertex[t].dist;
}
int main() {
int n, m, i;
struct Graph g;
scanf("%d%d", &n, &m);
g.edge_count = 0;
for (i = 1; i <= n; i++) {
g.vertex[i].head = NULL;
}
for (i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add_edge(&g, u, v, w);
}
printf("%d\n", dijkstra(&g, 1, n));
return 0;
}
```
该代码使用了邻接表来存储图的信息,使用了结构体来表示顶点和边。在主函数中,首先读入图的信息,然后调用 dijkstra 函数求解从 1 号城市到 n 号城市的最短路径。dijkstra 函数使用了一个数组来表示每个顶点的最短距离和是否已经被访问过。在循环过程中,每次选择未被访问过且距离起点最近的顶点,并更新其相邻顶点的最短距离。循环直到终点被访问或者所有能够到达的顶点都被访问过。最后输出终点的最短距离,如果为 INT_MAX,则表示无法到达。
阅读全文