最短路径算法c代码(最短路径算法c语言代码)
admin 发布:2022-12-19 21:45 146
本篇文章给大家谈谈最短路径算法c代码,以及最短路径算法c语言代码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
c语言数据结构 最短路径问题代码
直接看代码:
#include stdlib.h
#define MAXVEX 10
typedef struct graph{
int n,e;//顶点数、边数
char vexs[MAXVEX];//顶点数组
int arcs[MAXVEX][MAXVEX];//邻接矩阵
int kind;//类型:0有向图;1无向图;2有向网;3无向网
} MGraph;
void PrintPath(MGraph G,int *p,int i){
if(p[i]=0){
PrintPath(G,p,p[i]);//先输出前驱顶点
}
printf("%c",G.vexs[i]);//输出本顶点
}
void Dijkstra(MGraph G, int v){
//用Dijkstra算法求有向网G中序号为v的顶点到
//其余各顶点的最短路径
int *s,*d,*p,i,j,k,min;
if(v0||v=G.n){//顶点编号参数错误
printf("Dijkstra parameter ERROR! v0 Or v=%d",G.n);
return;
}
s=(int *)malloc(sizeof(int)*G.n);
d=(int *)malloc(sizeof(int)*G.n);
p=(int *)malloc(sizeof(int)*G.n);
for(i=0;iG.n;i++){ //初始化辅助数组,置0
s[i]=0;d[i]=G.arcs[v][i];
if(d[i]!=0)p[i]=v; //v是vi的直接前驱
else p[i]=-1; //-1表示无直接前驱
}
s[v]=1;d[v]=0; //确定源点自身的最短路径长度
printf("Dijkstra: (The shortest path from %c:)\n",G.vexs[v]);
for(i=0;iG.n-1;i++){
//确定v到其余n-1个顶点的最短路径
min=32767;k=-1;
for(j=0;jG.n;j++){
//找出路径长度最小的顶点k
if(!s[j]d[j]!=0d[j]min){
k=j; min=d[k];
}
}
if(k0){//有未能到达的顶点,把它们输出
for(j=0;jG.n;++j){
if(j==v)continue;
if(s[j]==0){
printf("%c-%c: No path.\n",G.vexs[v],G.vexs[j]);
}
}
free(s); free(d); free(p);
return; //已完成或出现不连通的顶点
}
s[k]=1;
printf("%c-%c: d=%-5d, p=",G.vexs[v],G.vexs[k],d[k]);
PrintPath(G,p,k);//输出v到i的路径(正序)
printf("\n");
for(j=0;jG.n;j++){
//更新其余顶点的最短路径及前驱
if(!s[j]G.arcs[k][j]!=0(d[j]==0||d[j]d[k]+G.arcs[k][j])){
d[j]=d[k]+G.arcs[k][j]; p[j]=k;
}
}
}
free(s); free(d); free(p);
}
这是单源的最短路径算法。
最短路径算法 C语言
#include stdio.h
#define MAXNODE 108
int path[MAXNODE + 1][MAXNODE + 1] = {0};
int main(void)
{
FILE *fpr, *fpw;
int va, vb, i, j, k;
fpr = fopen("in.txt", "r"); /* 读取的文件名称in.txt */
fpw = fopen("out.txt", "w"); /* path的数据在out.txt中展现 */
while (fscanf(fpr, "%d%d", va, vb) != EOF)
path[va][vb] = path[vb][va] = 1;
for (k = 1; k = MAXNODE; ++k) {
for (i = 1; i = MAXNODE; ++i) {
for (j = 1; j = MAXNODE; ++j) {
if (!path[i][k] || !path[k][j])
continue;
if (!path[i][j])
path[i][j] = path[i][k] + path[k][j];
else if (path[i][j] path[i][k] + path[k][j])
path[i][j] = path[i][k] + path[k][j];
}
}
}
for (i = 1; i = MAXNODE; ++i) {
for (j = 1; j = MAXNODE; ++j) {
if (i == j)
fprintf(fpw, "%-10d", 0);
else if (path[i][j])
fprintf(fpw, "%-10d", path[i][j]);
else
fprintf(fpw, "%-10d", -1);
}
fprintf(fpw, "\n");
}
return 0;
}
注意:floyd算法中k为最外层,这是动态规划的思想,不能改变i,j,k的顺序!!!
这是之前的答案的错误之处。
-1表示不通。
具体程序分析,我可以加你QQ,愿意的话,你把QQ写给我。
求floyd最短路径算法,c语言代码;
就是一个三重循环,核心代码就这几行
for(k=0;kn;k++)
{
for(i=0;in;i++)
for(j=0;jn;j++)
if(A[i][j](A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
最短路径算法 Dijkstra 用C语言编出来
#include"iostream.h"
#include"stdlib.h"
#define MAXPOINT 3//定义最大的顶点数目
#define limit 32767 //设置没有路径的权代替无穷大
struct record{ //没个顶点的数据结构设置为一个数组队列
int number; //顶点号
int flag; //标志是否从队列中被选过如果为1表示选过为0表示未选
int allpath; //从源点到这个点的当前最短距离(权最小)
}path[MAXPOINT+1];
int cost[MAXPOINT+1][MAXPOINT+1]; //用来表示图的邻接矩阵
void main()
{int i,j,temp,front=1,rear=MAXPOINT,N,minnumber;
//temp表示在数组队列中的当前下标 front表示队列首 rear表示队列尾
//N 表示待输入的源点号码 minnumber 表示选中的点的号码
int min=32768; //设置一个初始值
for(i=1;i=MAXPOINT;i++)
for(j=1;j=MAXPOINT;j++)
{cout"请输入从第"i"点到第"j"点的路径长度(权)如果没有路径的话请输入'32767' "endl;
cincost[i][j]; //初始化所有点之间的(权)路径值
}
//cout"请输入源点号"endl; //输入一个起点
//cinN;
for(N=MAXPOINT;N=1;N--)//把每一个点轮流地都设置为起点,可以求出任意一对顶点之间的最短路径
{ for(i=front;i=rear;i++) //初始化每个点的信息
{if(i==N)
path[i].allpath=0;
else
path[i].allpath=limit;
path[i].flag=0;
path[i].number=i;
}
while(rear=1) //控制循环次数
{for(temp=front;temp=MAXPOINT;temp++)
{ if(path[temp].allpathminpath[temp].flag==0)//选出一个具有最值
//的点
{ minnumber=path[temp].number;
min=path[temp].allpath ;
}
}
min=32768;
path[minnumber].flag=1;//把选中的点的标志变量置1表示已经被选过避免选中
for(i=1;i=MAXPOINT;i++)//进行类似广度优先搜索,更新最短路径
{if((i!=minnumber)(path[minnumber].allpath+cost[minnumber][i]path[i].allpath))
path[i].allpath=path[minnumber].allpath+cost[minnumber][i];
}
rear--;//次数减1
}
rear=MAXPOINT; //恢复数组以便于下一点的循环
for(j=1;j=MAXPOINT;j++)
{ cout"第"N"点到第"j"点的最短路径长度(权)为";
coutpath[j].allpath endl;
}
}
}
//这个程序可以求出任意一对顶点之间的最短路径,不过这种算法效率还不是很高,还有其他算法待续
求c语言最短路径算法
#include iostream
using namespace std;
const int maxnum = 100;
const int maxint = 999999;
// 各数组都从下标1开始
int dist[maxnum]; // 表示当前点到源点的最短路径长度
int prev[maxnum]; // 记录当前点的前一个结点
int c[maxnum][maxnum]; // 记录图的两点间路径长度
int n, line; // 图的结点数和路径数
// n -- n nodes
// v -- the source node
// dist[] -- the distance from the ith node to the source node
// prev[] -- the previous node of the ith node
// c[][] -- every two nodes' distance
void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])
{
bool s[maxnum]; // 判断是否已存入该点到S集合中
for(int i=1; i=n; ++i)
{
dist[i] = c[v][i];
s[i] = 0; // 初始都未用过该点
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] = 1;
// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
// 注意是从第二个节点开始,第一个为源点
for(int i=2; i=n; ++i)
{
int tmp = maxint;
int u = v;
// 找出当前未使用的点j的dist[j]最小值
for(int j=1; j=n; ++j)
if((!s[j]) dist[j]tmp)
{
u = j; // u保存当前邻接点中距离最小的点的号码
tmp = dist[j];
}
s[u] = 1; // 表示u点已存入S集合中
// 更新dist
for(int j=1; j=n; ++j)
if((!s[j]) c[u][j]maxint)
{
int newdist = dist[u] + c[u][j];
if(newdist dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
// 查找从源点v到终点u的路径,并输出
void searchPath(int *prev,int v, int u)
{
int que[maxnum];
int tot = 1;
que[tot] = u;
tot++;
int tmp = prev[u];
while(tmp != v)
{
que[tot] = tmp;
tot++;
tmp = prev[tmp];
}
que[tot] = v;
for(int i=tot; i=1; --i)
if(i != 1)
cout que[i] " - ";
else
cout que[i] endl;
}
int main()
{
freopen("input.txt", "r", stdin);
// 各数组都从下标1开始
// 输入结点数
cin n;
// 输入路径数
cin line;
int p, q, len; // 输入p, q两点及其路径长度
// 初始化c[][]为maxint
for(int i=1; i=n; ++i)
for(int j=1; j=n; ++j)
c[i][j] = maxint;
for(int i=1; i=line; ++i)
{
cin p q len;
if(len c[p][q]) // 有重边
{
c[p][q] = len; // p指向q
c[q][p] = len; // q指向p,这样表示无向图
}
}
for(int i=1; i=n; ++i)
dist[i] = maxint;
for(int i=1; i=n; ++i)
{
for(int j=1; j=n; ++j)
printf("%8d", c[i][j]);
printf("\n");
}
Dijkstra(n, 1, dist, prev, c);
// 最短路径长度
cout "源点到最后一个顶点的最短路径长度: " dist[n] endl;
// 路径
cout "源点到最后一个顶点的路径为: ";
searchPath(prev, 1, n);
}
最短路径算法c代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于最短路径算法c语言代码、最短路径算法c代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:淘宝gps源代码(GPS定位源码)
- 下一篇:v建站代码模版(建站模板免费下载)
相关推荐
- 05-12网页设计需要学什么,网页设计学什么语言
- 05-09网页代码,网页代码快捷键
- 05-06单页网站的代码(完整的网页代码)[20240506更新]
- 05-06个人主页图片代码(个人主页图片代码怎么弄)[20240506更新]
- 05-06提取微信名片代码(微信名片信息提取)[20240506更新]
- 05-06php后台权限管理代码(php管理员权限)[20240506更新]
- 05-06付费观看代码php(付费观看代码)[20240506更新]
- 05-06在线html执行代码(html怎么运行)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06代码源软件库(程序代码库)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接