昨天实验课写了一下,报告也已经写完交了,今天写出来。题目如下:
无非就是换了种存储结构,输出改成按节点顺序输出了,我就把上一次的代码改了一下,就通过了。
以下是我的实现:
#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); void print(struct step *gStep,struct graphList *gList); int main() { run (); return 0; } void run() { struct graphList gList; struct step gStep; createNewGraphList (&gList); DJ (&gStep,&gList); print (&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; clearStep (gStep,gList); initializeStep (gStep,gList); while (judgeStep (gStep,gList)) { min=findMinStepN (gStep,gList); updateStepN (gStep,gList,min); } } 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; for (i=0;i<gList->vexNum;i++) { if (gList->graph[0][i]!=10000) { gStep->flags[i]=1; gStep->stepN[i]=gList->graph[0][i]; } } } int judgeStep(struct step *gStep,struct graphList *gList) { int i; for (i=1;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=1;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; } } } } void print(struct step *gStep,struct graphList *gList) { int i; for (i=0;i<gList->vexNum;i++) { printf ("%d\n",gStep->stepN[i]); } }