#include <stdio.h> #include <stdlib.h> const int N=12; //顶点个数 const int M=0; void Dijkstra(int n, int v, int dist[], int prev[], int c[][N+1]) { bool s[N+1]; // 顶点集合s //初始化 for (int i=1;i<=n;i++) { dist[i]=c[v][i]; // 从源到顶点i的最短特殊路径长度 s[i]=false; if(dist[i]==M) prev[i]=0; // 从源到顶点i的最短路径上前一个顶点 else prev[i]=v; } dist[v]=0; s[v]=true; for(int i=1;i<n;i++)//未用到i值,只是控制循环次数。 { int mindist=M; int u=v; // 找到具有最短特殊路长度的顶点u for (int j=1;j<=n;j++) { if ((!s[j])&&(dist[j]<mindist))//j点不在s集合中,且到源点的距离小于上一个点到源点的距离,就用u记录下该点 { u=j; mindist=dist[j]; } } s[u]=true;//将u点加入s集合 // 更新dist值 for(int j=1;j<=n;j++)//当s集合加入新点的时候需要更新dist[]和prev[] { if ((!s[j])&&(c[u][j]<M))//j点不在s集合中,且新点与j点相邻 { int newdist=dist[u]+c[u][j];//新点到源点的距离+新点到j点的距离 if (newdist<dist[j]) { dist[j]=newdist; prev[j]=u;//新点成了j的前驱点,表示此时从源点到j点经过u距离最短 } } } } } //输出最短路径 v源点,i终点, void Traceback(int v, int i, int prev[]) { // 源点等于终点时,即找出全部路径 if (v==i) { printf("%d",i); return; } Traceback(v,prev[i],prev); printf("->%d",i); } int main() { int dist[N+1]; // 从源到顶点i的最短特殊路径长度 int prev[N+1]; // 从源到顶点i的最短路径上前一个顶点 //带权有向图 int i,j,c[N+1][N+1]; printf("矩阵:\n"); for(i=0;i<N+1;i++) { for(j=0;j<N+1;j++) { c[i][j]=rand()%5; c[0][j]=j; c[i][0]=i; if(i==j||c[i][j]==0) c[i][j]=M; printf("%d ",c[i][j]); } printf("\n"); } //指定源点 int v; printf("请输入指定源点:"); scanf("%d",&v); // 狄克斯特拉算法的应用 Dijkstra(N,v, dist, prev, c); for(int i=1; i<=N; i++){ if(dist[i]!=M) { printf("源点到顶点%d的最短距离为:%d\n",i,dist[i]); printf("路径为:"); Traceback(v,i, prev); printf("\n"); } else printf("源点不能到顶点%d\n",i); } return 0; }
时间: 2024-04-24 15:22:39 浏览: 8
这是一个使用 Dijkstra 算法对带权有向图进行最短路径搜索的 C 语言程序。程序中定义了常量 N 和 M,分别表示顶点个数和边权值的最大值。Dijkstra 函数实现了 Dijkstra 算法的核心逻辑,包括初始化和更新 dist 和 prev 数组的过程。Traceback 函数则是用于输出路径的函数,它通过递归的方式从终点回溯到源点,输出最短路径。
在程序主函数中,首先生成了一个带权有向图的邻接矩阵 c。然后要求用户输入源点 v,然后调用 Dijkstra 函数计算从源点到其它顶点的最短距离和路径,并输出结果。
需要注意的是,在程序中采用了 M 来表示两个顶点之间没有边相连或者边权值为无穷大,这是 Dijkstra 算法的一个常见用法。
相关问题
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { const int size=3; int boa
这段代码是一个C语言程序,它包含了三个头文件:stdio.h、stdlib.h和time.h。这些头文件提供了一些常用的函数和类型定义,以便在程序中使用。
在main函数中,定义了一个常量size,并初始化为3。接下来,定义了一个整型变量boa,但是代码截断了,无法看到完整的代码。根据代码的上下文,可能是要定义一个大小为3的整型数组boa。
如果你能提供完整的代码,我可以给你更详细的解释和帮助。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #define SHA1_BLOCK_SIZE 20 #define SHA1_DIGEST_SIZE 5
SHA-1是一种密码散列函数,用于产生消息的数字指纹。SHA-1算法的输出长度为160位,即20个字节。在C语言中,可以使用以下代码来实现SHA-1算法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define SHA1_BLOCK_SIZE 20
#define SHA1_DIGEST_SIZE 5
void sha1(const uint8_t *message, size_t message_len, uint8_t *digest) {
// TODO: 实现SHA-1算法
}
int main() {
uint8_t message[] = "hello world";
uint8_t digest[SHA1_DIGEST_SIZE];
sha1(message, strlen((char *)message), digest);
printf("SHA-1 digest: ");
for (int i = 0; i < SHA1_DIGEST_SIZE; i++) {
printf("%02x", digest[i]);
}
printf("\n");
return 0;
}
```