简单最短路径问题编程c语言,C语言最短路径问题

C语言最短路径问题

#include "datastru.h"

#include #include #define MAX 10000

MGRAPH create_mgraph(){

int i, j, k, h;

MGRAPH mg;

mg.kind = 3;

printf("\n\n输入顶点数和边数(用逗号隔开) : ");

scanf("%d,%d", &i,&j);

mg.vexnum = i;

mg.arcnum = j;

fflush(stdin);

for(i = 0; i < mg.vexnum; i++)

{ printf("输入顶点 %d 的值 : ",i + 1);

scanf("%d", &mg.vexs[i]);

fflush(stdin);}

for(i = 0; i < mg.vexnum; i++)

for(j = 0; j < mg.vexnum; j++)

mg.arcs[i][j] = MAX;

for(k = 1; k <= mg.arcnum; k++)

{ printf("输入第 %d 条边的起始顶点和终止顶点(用逗号隔开): ",k);

scanf("%d,%d",&i,&j);

fflush(stdin);

while(i < 1 || i > mg.vexnum || j < 1 || j > mg.vexnum)

{ printf("输入错,重新输入: ");

scanf("%d,%d", &i, &j);}

printf("输入此边权值 : ");

scanf("%d", &h);

mg.arcs[i - 1][j - 1] = h;}

return mg;

}

main()

{

MGRAPH mg;

int cost[MAXLEN][MAXLEN];

int path[MAXLEN], s[MAXLEN];

int dist[MAXLEN];

int i, j, n, v0, min, u;

printf("\n求有向图单源点最短路径\n");

mg = create_mgraph();

printf("\n\n起始顶点为 : ");

scanf("%d", &v0);

v0 --;

n = mg.vexnum;

for(i = 0; i < n; i++)

{for(j = 0; j < n; j++)

cost[i][j] = mg.arcs[i][j];

cost[i][i] = 0;}

for(i = 0; i < n; i++)

{dist[i] = cost[v0][i];

if(dist[i] < MAX && dist[i] > 0)

path[i] = v0;}

for(i = 0; i < n; i++)

s[i] = 0;

s[v0] = 1;

for(i = 0; i < n; i++)

{ min = MAX ;

u = v0;

for(j = 0; j < n; j++)

if(s[j] == 0 && dist[j] < min)

{min = dist[j];

u = j;}

s[u] = 1;

for(j = 0; j < n; j++)

if(s[j] == 0 && dist[u] + cost[u][j] < dist[j])

{dist[j] = dist[u] + cost[u][j];

path[j] = u;}

}

for(i = 0; i < n; i++)

if(s[i] == 1)

{u = i;

while(u != v0)

{printf("%d u = path[u];}

printf("%d ", u + 1);

printf(" d = %d\n", dist[i]);

}

else

printf("%d printf("\n\n");

}

文章来源:

非常夏日毕业设计www.bysjdz.com  毕业设计 毕业论文  论文定做 免费论文  开题报告  文献综述  外文翻译  毕业设计定做  计算机毕业设计  计算机毕业论文 计算机外文翻译

找吧!毕业设计  www.zhaobysj.com 毕业设计 毕业论文 论文定做 免费论文 开题报告  文献综述 外文翻译  毕业设计定做  计算机毕业设计   计算机毕业论文 计算机外文翻译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值