您的位置:首页 > 其它

迪杰斯特拉

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;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: