# NOJ-用迪杰特斯拉算法求赋权图中的最短路径-西工大数据结构

边看锤子的发布会边改出来的，他那发布会的演示真是尴尬死了，所以我写了个烂代码（我实在不想重写了）。。。题目如下：

还是dj算法，我就把其中的dj相关函数改了一下，记录一下stepN中到终点的距离，如果改变了，说明min就是要走的结点，如果终点被更新掉了，说明已经找到到终点的最短走法，直接跳出结束就行了。

其中改变了这几个函数，就是遍历时改为从头开始，判断输出一下就可以了：

void DJ(struct step *gStep,struct graphList *gList);
void initializeStep(struct step *gStep,struct graphList *gList);
int judgeStep(struct step *gStep,struct graphList *gList);
int findMinStepN(struct step *gStep,struct graphList *gList);
void updateStepN(struct step *gStep,struct graphList *gList,int min);

以下是我的实现：

#include <stdio.h>
#include <stdlib.h>

struct graphList
{
int vexNum;
int graph[120][120];
};

struct step
{
int flags[3000];
int stepN[3000];
};

void run();
void createNewGraphList (struct graphList *gList);
void DJ(struct step *gStep,struct graphList *gList);
void clearStep(struct step *gStep,struct graphList *gList);
void initializeStep(struct step *gStep,struct graphList *gList);
int judgeStep(struct step *gStep,struct graphList *gList);
int findMinStepN(struct step *gStep,struct graphList *gList);
void updateStepN(struct step *gStep,struct graphList *gList,int min);

int main()
{
run ();
return 0;
}

void run()
{
struct graphList gList;
struct step gStep;
createNewGraphList (&gList);
DJ (&gStep,&gList);
}

void createNewGraphList(struct graphList *gList)
{
int i,j;
scanf ("%d",&(gList->vexNum));
for (i=0;i<gList->vexNum;i++)
{
for (j=0;j<gList->vexNum;j++)
{
scanf ("%d",&(gList->graph[i][j]));
}
}
}

void DJ(struct step *gStep,struct graphList *gList)
{
int min;
int end,endStep;
clearStep (gStep,gList);
initializeStep (gStep,gList);
scanf ("%d",&end);
endStep=gStep->stepN[end];
while (judgeStep (gStep,gList))
{
min=findMinStepN (gStep,gList);
if (gStep->flags[end])
{
if (endStep!=gStep->stepN[end])
{
endStep=gStep->stepN[end];
printf ("%d\n",min);
}
}
else
{
printf ("%d\n",min);
break;
}
}
}

void clearStep(struct step *gStep,struct graphList *gList)
{
int i;
for (i=0;i<gList->vexNum;i++)
{
gStep->flags[i]=-1;
gStep->stepN[i]=0;
}
}

void initializeStep(struct step *gStep,struct graphList *gList)
{
int i;
int start;
scanf ("%d",&start);
printf ("%d\n",start);
for (i=0;i<gList->vexNum;i++)
{
if (gList->graph[start][i]!=10000)
{
gStep->flags[i]=1;
gStep->stepN[i]=gList->graph[start][i];
}
}
gStep->flags[start]=-1;
gStep->stepN[start]=0;
}

int judgeStep(struct step *gStep,struct graphList *gList)
{
int i;
for (i=0;i<gList->vexNum;i++)
{
if (gStep->flags[i]==1)
{
return 1;
}
}
return 0;
}

int findMinStepN(struct step *gStep,struct graphList *gList)
{
int i,min=99999,n=-1;
for (i=0;i<gList->vexNum;i++)
{
if (gStep->flags[i]==1)
{
if (gStep->stepN[i]<min)
{
min=gStep->stepN[i];
n=i;
}
}
}
return n;
}

void updateStepN(struct step *gStep,struct graphList *gList,int min)
{
int i;
int minStepN=gStep->stepN[min];
gStep->flags[min]=0;
for (i=0;i<gList->vexNum;i++)
{
if (gStep->flags[i]==1)
{
if (gStep->stepN[i]>gList->graph[min][i]+minStepN)
{
gStep->stepN[i]=gList->graph[min][i]+minStepN;
}
}
else
{
if (gStep->flags[i]==-1)
{
gStep->flags[i]=1;
gStep->stepN[i]=gList->graph[min][i]+minStepN;
}
}
}
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120