边看锤子的发布会边改出来的,他那发布会的演示真是尴尬死了,所以我写了个烂代码(我实在不想重写了)。。。题目如下:
还是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); updateStepN (gStep,gList,min); 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; } } } }