迪杰斯特拉
2015-07-23 09:41
239 查看
我擦个迪杰斯特拉,这都是大二上学期的事了,现在才敲这个算法,不过还好,反正要抓紧时间了,网上有很多的迪杰斯特拉代码,貌似有点不太适合我的口味,还是什么事要自己来。
还有一份迪杰斯特拉代码:
#include<stdio.h> #define MAX 0x3fffffff //这个变量只能读 #define MAX_SIZE 2005 int path[MAX_SIZE] = {0}; int dist[MAX_SIZE]; struct fun { int v;//顶点 int e;//边 int p[MAX_SIZE][MAX_SIZE]; }page; void init () //初始化 { int i = 0, j; for(i = 1; i <= page.v;i++) { page.p[i][i] = 0; for(j = 1; j<i; j++) { page.p[j][i] = page.p[i][j] = MAX; } dist[i] = MAX; } } void djst() { int min; int i, j, k, t =1; for(i = 1; i <=page.v; i++ ) { dist[i] = page.p[1][i];//记录各条最小路长度 } path[1] = 1;//表示i = 0 这个节点已经选过 for(i = 2; i<=page.v; i++)//寻找各条最短路径 { min = MAX; for(j = 1; j<= page.v; j++)//选择最小权值路径 if(!path[j]&&dist[j] < min)//选择没选的点中最小点,更新最小值 { k = j; min = dist[j]; } path[k]= 1;//record k to be choosed for(j = 1; j <= page.v; j++)//修改路径 { if(!path[j] && page.p[k][j] < MAX && dist[k]+page.p[k][j] < dist[j])//do not record the number that has thought; dist[j] = dist[k] + page.p[k][j];//alter the distance } } printf("%d\n", dist[page.v]); } int main() { int x, y, value; int i, j; while(scanf("%d%d", &page.e, &page.v) != EOF) { init(); for(i = 1; i <= page.e; i++) { scanf("%d%d%d",&x, &y, &value); if(page.p[y][x] > value) page.p[y][x] = page.p[x][y] = value; } djst(); } return 0; }
还有一份迪杰斯特拉代码:
#include <stdio.h> #include <stdlib.h> #include <limits.h> //定义整型数据范围的 #define Max 10000 typedef struct { int Vexnum; int Arcnum; int Arc[Max][Max]; }Mgraph ; void Init(Mgraph *G) { int i,j,temp; int Vex_1,Vex_2; for(i=1;i<=G->Vexnum;i++) for(j=1;j<=G->Vexnum;j++) G->Arc[i][j]=INT_MAX; for(i=1;i<=G->Arcnum;i++) { scanf("%d%d%d",&Vex_1,&Vex_2,&temp); G->Arc[Vex_1][Vex_2]=temp; G->Arc[Vex_2][Vex_1]=temp; } } void Dijkstra(Mgraph *G,int start) { int i,j,l; int k,min_len; int Dist[Max],Path[Max]; Path[Max]={0}; for(i=1;i<=G->Vexnum;i++) if(i!=start) Dist[i]=G->Arc[start][i]; Path[start]=1; for(i=1;i<=G->Vexnum;i++) printf("%d\t",Dist[i]); printf("\n"); for(i=1;i<G->Vexnum;i++) { min_len=INT_MAX; for(l=1;i<=G->Vexnum;l++) if(!Path[l]&&Dist[l]<min_len) { printf("%d\n",l); k=l; min_len=Dist[l]; } Path[k]=1; printf("%d到%d的最短路径为%d\n",start,k,Dist[k]); for(j=1;j<=G->Vexnum;j++) if(!Path[i]&&G->Arc[k][j]<INT_MAX&&G->Arc[k][j]+Dist[k]<Dist[j]) Dist[j]=G->Arc[k][j]+Dist[j]; } } int main(void) { Mgraph *G; G=(Mgraph *)malloc(sizeof(Mgraph)); printf("请输入点的个数,边的个数(x y):\n"); scanf("%d%d",&G->Vexnum,&G->Arcnum); Init(G); for(int i=1;i<=G->Vexnum;i++) { for(int j=1;j<=G->Vexnum;j++) printf("%d\t",G->Arc[i][j]); printf("\n"); } Dijkstra(G,1); return 0; }
相关文章推荐
- sprintf 和sprintf_s比较
- lucene 开发
- HDOJ 5293 Tree chain problem LCA+树链剖分+树形DP
- 监听日志过大,切换步骤
- android studio 自动序列化类插件
- ubuntu下为python安装BeautifulSoup
- android studio 自动序列化类插件
- Android设置透明状态
- jsonp sample
- H - Parity game-poj1733(需要离散化)
- aapt的常用命令
- Hadoop虚拟机固定Ip上网
- 2015年最新的解决办法“Connection to https://dl-ssl.google.com refused”
- Android Studio 之 Live Templates 高效利用
- 【DP】 HDOJ 5293 Tree chain problem
- 【IOS】简单的测试银联和微信支付
- codeforces #313(div 2)
- This site uses a plugin (application/baiducnff-activex)that is not supported 解决办法
- ifanr2基于框架实现
- C# 委托(delegate)使用之一二三步