使用pthreads实现最短路径算法并行化程序代码
下面是使用pthreads实现最短路径算法的并行化程序代码的一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_NODES 100
#define INF 99999
int graph[MAX_NODES][MAX_NODES];
int dist[MAX_NODES];
int num_nodes, num_threads;
pthread_mutex_t mutex;
struct ThreadData {
int start_node;
};
void* dijkstra(void* arg) {
struct ThreadData* data = (struct ThreadData*)arg;
int start_node = data->start_node;
// 初始化距离数组和已访问数组
for (int i = 0; i < num_nodes; i++) {
dist[i] = INF;
}
dist[start_node] = 0;
int visited[MAX_NODES] = {0};
for (int count = 0; count < num_nodes - 1; count++) {
int min_dist = INF;
int min_index;
// 找到当前未访问的节点中距离最小的节点
for (int i = 0; i < num_nodes; i++) {
if (!visited[i] && dist[i] < min_dist) {
min_dist = dist[i];
min_index = i;
}
}
// 标记该节点为已访问
visited[min_index] = 1;
// 更新与该节点相邻节点的距离
for (int i = 0; i < num_nodes; i++) {
if (!visited[i] && graph[min_index][i] && dist[min_index] != INF && dist[min_index] + graph[min_index][i] < dist[i]) {
dist[i] = dist[min_index] + graph[min_index][i];
}
}
}
pthread_mutex_lock(&mutex);
printf("Thread %d: shortest distances from node %d:\n", start_node, start_node);
for (int i = 0; i < num_nodes; i++) {
printf("%d -> %d: %d\n", start_node, i, dist[i]);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main() {
// 读取图数据和线程数量
printf("Enter the number of nodes: ");
scanf("%d", &num_nodes);
printf("Enter the adjacency matrix:\n");
for (int i = 0; i < num_nodes; i++) {
for (int j = 0; j < num_nodes; j++) {
scanf("%d", &graph[i][j]);
}
}
printf("Enter the number of threads: ");
scanf("%d", &num_threads);
// 创建线程并运行最短路径算法
pthread_t threads[num_threads];
struct ThreadData thread_data[num_threads];
pthread_mutex_init(&mutex, NULL);
for (int i = 0; i < num_threads; i++) {
thread_data[i].start_node = i;
pthread_create(&threads[i], NULL, dijkstra, (void*)&thread_data[i]);
}
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
请确保在编译和运行此代码之前已经安装了pthreads库
原文地址: http://www.cveoy.top/t/topic/ib3U 著作权归作者所有。请勿转载和采集!