在代码中直接导入一个加权有向图的c语言代码
时间: 2024-02-12 14:05:38 浏览: 22
以下是C语言实现加权有向图的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100 // 最大节点数
typedef struct Edge {
int src; // 起点
int dest; // 终点
int weight; // 权重
} Edge;
typedef struct Graph {
int num_vertices; // 节点数
int num_edges; // 边数
Edge *edges; // 边的数组
} Graph;
Graph *create_graph(int num_vertices, int num_edges) {
Graph *graph = (Graph *) malloc(sizeof(Graph));
graph->num_vertices = num_vertices;
graph->num_edges = num_edges;
graph->edges = (Edge *) malloc(num_edges * sizeof(Edge));
return graph;
}
void add_edge(Graph *graph, int src, int dest, int weight) {
graph->edges[graph->num_edges].src = src;
graph->edges[graph->num_edges].dest = dest;
graph->edges[graph->num_edges].weight = weight;
graph->num_edges++;
}
void bellman_ford(Graph *graph, int start) {
int dist[MAX_VERTICES];
for (int i = 0; i < graph->num_vertices; i++) {
dist[i] = INT_MAX; // 初始化距离
}
dist[start] = 0; // 起点到起点的距离为0
// 进行n-1轮松弛操作
for (int i = 0; i < graph->num_vertices - 1; i++) {
for (int j = 0; j < graph->num_edges; j++) {
int src = graph->edges[j].src;
int dest = graph->edges[j].dest;
int weight = graph->edges[j].weight;
if (dist[src] != INT_MAX && dist[dest] > dist[src] + weight) {
dist[dest] = dist[src] + weight; // 更新距离
}
}
}
// 检查是否存在负权回路
for (int i = 0; i < graph->num_edges; i++) {
int src = graph->edges[i].src;
int dest = graph->edges[i].dest;
int weight = graph->edges[i].weight;
if (dist[src] != INT_MAX && dist[dest] > dist[src] + weight) {
printf("存在负权回路\n");
return;
}
}
// 输出最短距离
printf("起点为%d的最短距离:\n", start);
for (int i = 0; i < graph->num_vertices; i++) {
printf("%d ", dist[i]);
}
printf("\n");
}
int main() {
int num_vertices, num_edges, start;
scanf("%d %d %d", &num_vertices, &num_edges, &start);
Graph *graph = create_graph(num_vertices, num_edges);
for (int i = 0; i < num_edges; i++) {
int src, dest, weight;
scanf("%d %d %d", &src, &dest, &weight);
add_edge(graph, src, dest, weight);
}
bellman_ford(graph, start);
return 0;
}
```
这个代码实现了Bellman-Ford算法来解决加权有向图的单源最短路径问题。它可以读入节点数、边数和起点,然后读入每条边的起点、终点和权重,最后输出起点到每个节点的最短距离。如果存在负权回路,则输出提示信息。