é®é¢ 1: å建æ¯ç¹å¾çå½æ°initgraph()é,å 为é»æ¥ç©éµæ¯å¯¹ç§°ç©éµ,æ以è¦å¯¹ç§°èµå¼,
å¿
é¡»æ¯ç¨è¯å¥ c->arcs[j][i].adj=c->arcs[i][j].adj;
注æ,æ¯[j][i]å¨å, è[i][j]å¨å.
èä¸æ¯c->arcs[i][j].adj=c->arcs[j][i].adj;//é误
é®é¢ 2: å½æ°allpath()è½è®¡ç®åºæçè·¯å¾çæ»çº¿è·¯é¿åº¦,ä½æ¯,æ¾ç¤ºçä¸éç»è¿ç顶ç¹ä¸å¯¹.
代ç çä¿®æ¹æ¹æ¡:
对äº"ä»»æä¸ç¹ä¸å
¶å®åç¹çæçè·¯å¾"çé®é¢,
å¯ä»¥ç¨è¿ªæ°æ¯ç¹æ(Dijkstra)ç®æ³,ä¹å¯ä»¥ç¨å¼æ´ä¼å¾·(Floyd)ç®æ³,
以ä¸æ¯ä¿®æ¹åç代ç ,æä¾ä¸¤ä¸ªæ¹æ¡:
void allpath_Floyd(mgraph c) //æ¹æ¡1:Floydç®æ³
void allpath_Dijkstra(mgraph c) //æ¹æ¡2:Dijkstraç®æ³
å¦ææä»»ä½é®é¢,å¯ä»¥ç¾åº¦ç§ä¿¡ç»æ.
#include "stdio.h"
#include "string.h"
#define Infinity 9999
#define MaxVertexNum 20
typedef struct arcell //è¾¹çä¿¡æ¯
{
int adj; //æå¼
}arcell,adjmatrix[MaxVertexNum][MaxVertexNum];
typedef struct vexsinfo //顶ç¹ä¿¡æ¯
{
int position; //æ¯ç¹çç¼å·
char name[32]; //æ¯ç¹å
char introduction[56]; //æ¯ç¹çä»ç»
}vexsinfo;
typedef struct mgraph//使ç¨é»æ¥ç©éµå®ç°å¾çåå¨
{
vexsinfo vexs[MaxVertexNum];//æ°ç»é¡¶ç¹åé,å顶ç¹ä¿¡æ¯
adjmatrix arcs; //é»æ¥ç©éµ
int vexnum,arcnum; //顶ç¹æ°åè¾¹æ°
}mgraph;
mgraph c; //å
¨å±åé
//å建æ¯ç¹å¾ (è¾å
¥åæ°æ¯æé)
void initgraph(mgraph *c)
{
int i,j;
c->vexnum=6; //顶ç¹çæ»æ°é
c->arcnum=8; //è¾¹çæ»æ°é
for(i=0;i<c->vexnum;i++)//设置顶ç¹ç¼å·
{
c->vexs[i].position=i;
}
strcpy(c->vexs[0].name,"v1");
strcpy(c->vexs[1].name,"v2");
strcpy(c->vexs[2].name,"v3");
strcpy(c->vexs[3].name,"v4");
strcpy(c->vexs[4].name,"v5");
strcpy(c->vexs[5].name,"v6");
//å
åå§åå¾çé»æ¥ç©éµ
for(i=0;i<c->vexnum;i++)
{
for(j=0;j<c->vexnum;j++)
{
c->arcs[i][j].adj=Infinity;
}
}
c->arcs[0][1].adj=7;
c->arcs[0][2].adj=11;
c->arcs[1][2].adj=10;
c->arcs[1][3].adj=9;
c->arcs[2][3].adj=5;
c->arcs[2][4].adj=7;
c->arcs[2][5].adj=8;
c->arcs[4][5].adj=6;
//é»æ¥ç©éµæ¯å¯¹ç§°ç©éµ,对称èµå¼
for(i=0;i<c->vexnum;i++)
{
for(j=0;j<c->vexnum;j++)
{
//注æ,æ¯[j][i]å¨å, è[i][j]å¨å.
c->arcs[j][i].adj=c->arcs[i][j].adj;
}
}
}
//æ¥çæ¯ç¹é´ç路线 [éè¦æ¹å]
void allpath(mgraph c)
{
//æ±ä»é¡¶ç¹v0å°å
¶ä½é¡¶ç¹çæçè·¯å¾p[]å带æé¿åº¦d[v]ï¼æçè·¯å¾çè·ç¦»ï¼
//p[][]æ°ç»ç¨äºåæ¾ä¸¤é¡¶ç¹é´æ¯å¦æéè·¯æ è¯ï¼å¦æp[v][w]=1ï¼åwæ¯ä»v0å°vçæçè·¯å¾ä¸ç顶ç¹
//visited[æ°ç»ç¨äºè®¾ç½®è®¿é®æ å¿
int v,w,i,min,t=0,x; //åét没æ使ç¨
int v0;//v0为起å§æ¯ç¹çç¼å·
int visited[20],d[20],p[20][20];
printf("\n请è¾å
¥ä¸ä¸ªèµ·å§æ¯ç¹çç¼å·:");
scanf("%d",&v0);
printf("\n\n");
while(v0<0 ||v0>c.vexnum)
{
printf("\næ¨è¾å
¥çæ¯ç¹ä¸åå¨\n");
printf("请éæ°è¾å
¥ï¼");
scanf("%d",&v0);
}
for(v=0;v<c.vexnum;v++)
{
visited[v]=0;//åå§åå个æ¯ç¹ç访é®æ è¯
d[v]=c.arcs[v0][v].adj;//v0å°å顶ç¹vçæå¼èµç»d[v],arcsæ¯ä¸´çç©éµå两æ¯ç¹é´çä¿¡æ¯
for(w=0;w<c.vexnum;w++)
p[v][w]=0;//åå§åæ°ç»ï¼å顶ç¹ä¹é´çè·¯å¾å
¨é¨è®¾ç½®ä¸ºç©º
if(d[v]<Infinity)//v0å°væè¾¹ç¸è¿ï¼ä¿®æ¹p[v][w]çå¼ä¸º1
{
p[v][v0]=1;
p[v][v]=1;//å顶ç¹å°èªå·±è¦èé
}
}
d[v0]=0;//èªå·±å°èªå·±çæå¼è®¾ç½®ä¸º0
visited[v0]=1;
for(i=1;i<c.vexnum;i++)//对å
¶ä½c.vexnum-1个顶ç¹wï¼ä¸æ¬¡æ±vå°wçæçè·¯å¾
{
min=Infinity;
for(w=0;w<c.vexnum;w++)
if(!visited[w])
if(d[w]<min)
{
v=w;min=d[w];
}
visited[v]=1;
for(w=0;w<c.vexnum;w++)
if(!visited[w]&&(min+c.arcs[v][w].adj<d[w]))//vå° wæè¾¹ç¸è¿
{
d[w]=min+c.arcs[v][w].adj;//ä¿®æ¹v0å°wçæå¼d[w]
for(x=0;x<c.vexnum;x++)//ææv0å°vçæçè·¯å¾é½æ¯v0å°wçæçè·¯å¾ä¸ç顶ç¹
p[w][x]=p[v][x];
p[w][w]=1;
}}
for(v=0;v<c.vexnum;v++)//è¾åºv0å
¶å®æ¯ç¹vçæçè·¯å¾
{
if(v0!=v)
printf("%s",c.vexs[v0].name);//è¾åºæ¯ç¹v0çå称
for(w=0;w<c.vexnum;w++)//对å¾ä¸æ¯ä¸ªé¡¶ç¹wï¼è¯æ¢wæ¯å¦æ¯v0å°vçæçè·¯å¾ä¸ç顶ç¹
{
if(p[v][w] &&w!=v0 && w!=v)//å¦æwæ¯ä¸ä¸çäºv0ï¼åè¾åºè¯¥æ¯ç¹
printf("---->%s",c.vexs[v].name);
}
printf("---->%s",c.vexs[v].name);
printf("\næ»è·¯çº¿é¿ä¸º%dç±³:\n\n",d[v]);
}
}
//è¾åºä»»æä¸ç¹ä¸å
¶å®åç¹çæçè·¯å¾
//ç®æ³: å¼æ´ä¼å¾·(Floyd)
void allpath_Floyd(mgraph c)
{
int v,w,k;
int v0; //è¾å
¥çèµ·å§é¡¶ç¹ç¼å·
int P[MaxVertexNum][MaxVertexNum]; //äºç»´æ°ç»Pç¨äºè®°å½ä¸¤ç¹ä¹é´çè·¯å¾ä¸æ
int D[MaxVertexNum][MaxVertexNum]; //äºç»´æ°ç»Dç¨äºè®°å½æ¯æ¡è¾¹çæå¼(ä¹å°±æ¯è·ç¦»)
while(1)
{
printf("请è¾å
¥ä¸ä¸ªèµ·å§æ¯ç¹çç¼å·(%då°%d): ",0,c.vexnum-1);
scanf("%d",&v0);
//æ¯ç¹å¾æc.vexnum个顶ç¹,ç¼å·ä»0å°(c.vexnum-1)
if(v0<0 || v0 >= c.vexnum)
{
printf("æ¯ç¹çç¼å·ä¸åå¨!请éæ°è¾å
¥ç¼å·\n");
continue; //ç´æ¥è·³å°while()è¯å¥,继ç»å¾ªç¯
}
else
{
break;
}
}
//对æ°ç»Dåæ°ç»Pè¿è¡åå§å
for(v=0; v < c.vexnum; v++)
{
for(w=0; w < c.vexnum; w++)
{
D[v][w]=c.arcs[v][w].adj; //D[v][w]å¡«å
¥çåå§å¼å°±æ¯æ¯æ¡è¾¹çæå¼(ä¹å°±æ¯è·ç¦»)
P[v][w]=w; //Pé»è®¤å¡«å
¥é¡¶ç¹ç¼å·w,ä½ä¸ºç»ç¹
}
}
//Floydç®æ³çæ ¸å¿ä»£ç : 3å±for循ç¯
//æå¤å±çkæ¯ä¸é´ç¹, væ¯èµ·ç¹, wæ¯ç»ç¹
for(k=0; k<c.vexnum; ++k)
{
for(v=0; v<c.vexnum; ++v)
{
for(w=0; w<c.vexnum; ++w)
{
if ( D[v][w] > (D[v][k]+D[k][w]) )
{
//å¦æç»è¿ä¸æ 为k顶ç¹è·¯å¾æ¯å两ç¹é´è·¯å¾æ´ç,
//é£ä¹,å°±å°å½å两ç¹é´æå¼è®¾ä¸ºæ´å°çä¸ä¸ªè·¯å¾è®¾ç½®ä¸ºç»è¿ä¸æ 为kç顶ç¹
D[v][w]=D[v][k]+D[k][w];
P[v][w]=P[v][k];
}
}
}
}
v=v0; //v0æ¯èµ·å§é¡¶ç¹ç¼å·
for(w=0; w<c.vexnum; w++) //éåææ顶ç¹
{
if(v==w)
{
continue;
}
k=P[v][w]; //è·å¾"第ä¸ä¸ª"è·¯å¾é¡¶ç¹ä¸æ
printf("%s",c.vexs[v].name); //æå°"èµ·ç¹"çå称
while(k!=w) //å¦æè·¯å¾é¡¶ç¹ä¸æ ä¸æ¯ç»ç¹
{
printf("-->%s",c.vexs[k].name); //æå°è·¯å¾"ç»è¿ç顶ç¹"çå称
k=P[k][w]; //è·å¾"ä¸ä¸ä¸ª"è·¯å¾é¡¶ç¹ä¸æ
}
printf("-->%s",c.vexs[w].name); //æå°"ç»ç¹"çå称
printf(" æ»è·¯çº¿é¿%dm",D[v][w]);
printf("\n\n");
}
}
//è¾åºä»»æä¸ç¹ä¸å
¶å®åç¹çæçè·¯å¾
//ç®æ³: 迪æ°æ¯ç¹æ(Dijkstra)
void allpath_Dijkstra(mgraph c)
{
int v0; //è¾å
¥çèµ·å§é¡¶ç¹ç¼å·
int w0;
int v,w,k,min;
int qty;
int finalData[MaxVertexNum]; //finalData[w]=1表示已ç»æ±å¾èµ·å§é¡¶ç¹v0å°vw(wæ¯ä¸æ )çæçè·¯å¾
int P[MaxVertexNum]; //æ°ç»Pç¨äºè®°å½ä¸¤ç¹ä¹é´çè·¯å¾ä¸æ
int D[MaxVertexNum]; //æ°ç»Dç¨äºåå¨å°åç¹æçè·¯å¾çæå¼å
int PathBuf[MaxVertexNum]; //åå
¥æ顺åºçè·¯å¾ä¸æ (ç¨äºå±å¹æ¾ç¤º)
while(1)
{
printf("请è¾å
¥ä¸ä¸ªèµ·å§æ¯ç¹çç¼å·(%då°%d): ",0,c.vexnum-1);
scanf("%d",&v0);
//æ¯ç¹å¾æc.vexnum个顶ç¹,ç¼å·ä»0å°(c.vexnum-1)
if(v0<0 || v0 >= c.vexnum)
{
printf("æ¯ç¹çç¼å·ä¸åå¨!请éæ°è¾å
¥ç¼å·\n");
continue; //ç´æ¥è·³å°while()è¯å¥,继ç»å¾ªç¯
}
else
{
break;
}
}
for(v=0; v < c.vexnum; v++) //åå§åæ°æ®
{
finalData[v] = 0; //å
¨é¨é¡¶ç¹åå§å为æªç¥æçè·¯å¾ç¶æ
D[v] = c.arcs[v0][v].adj; //å°ä¸v0ç¹æè¿çº¿ç顶ç¹å ä¸æå¼
P[v] = 0; //åå§åè·¯å¾æ°ç»P为0
}
D[v0] = 0; //v0è³v0è·¯å¾ä¸º0
finalData[v0] = 1; //çäº1,å°±æ¯è¡¨ç¤ºv0è³v0ä¸éè¦æ±è·¯å¾
//å¼å§ä¸»å¾ªç¯, æ¯æ¬¡æ±å¾v0å°æ个v顶ç¹çæçè·¯å¾
for(v=0; v < c.vexnum; v++)
{
if(v==v0) continue;
min=Infinity; //å½åæç¥éç离v0顶ç¹çæçè·ç¦»
for(w=0; w < c.vexnum; w++) //寻æ¾ç¦»v0æè¿ç顶ç¹
{
//å¦æfinalData[w]çäº0,表示ä¸æ wç顶ç¹è¿æ²¡ææ¾å°æçè·¯å¾
if(finalData[w]==0 && D[w]<min)
{
k = w;
min = D[w]; //w顶ç¹ç¦»v0顶ç¹æ´è¿,ææ¶å°å
¶è®¾ä¸ºæçè·ç¦»
}
}
finalData[k] = 1; //å°ç®åæ¾å°çæè¿ç顶ç¹ç½®ä¸º1,表示已ç»æ¾å°æçè·¯å¾
for(w=0; w < c.vexnum; w++) //éåææ顶ç¹,ä¿®æ£å½åæçè·¯å¾åè·ç¦»
{
//å¦æç»è¿v顶ç¹çè·¯å¾æ¯ç°å¨è¿æ¡è·¯å¾çé¿åº¦ççè¯,
//说ææ¾å°äºæ´ççè·¯å¾, ä¿®æ¹æ°å¼D[w]åP[w]éçå¼
if(finalData[w]==0 && ( min+c.arcs[k][w].adj < D[w] ))
{
D[w] = min + c.arcs[k][w].adj; //ä¿®æ¹å½åè·¯å¾é¿åº¦
P[w] = k;
}
}
}
//æ§è¡å®Dijkstraç®æ³ä¹å,ä¸ç»´æ°ç»P[]éåæ¾çæçè·¯å¾æ¯"ååº"ç,
//æ以,å
ç¨æ°ç»PathBuf[]å°"ååº"çè·¯å¾åæ¾èµ·æ¥,
//ç¶å,ä»æ°ç»PathBuf[]çæ«å°¾å¼å§æå°,è¿æ ·,å±å¹æ¾ç¤ºçå°±æ¯"æ£å顺åº"çè·¯å¾.
for(w0=0 ; w0<c.vexnum ; w0++)
{
if(w0==v0)
{
continue;
}
qty=0;
PathBuf[qty]=w0; //w0æ¯æçè·¯ å¾ç"æåä¸ä¸ªé¡¶ç¹"çä¸æ
qty++;
k=w0;
while(P[k]!=0)
{
PathBuf[qty]=P[k]; //æçè·¯å¾éç"ä¸é´é¡¶ç¹"çä¸æ
qty++;
k=P[k];
}
PathBuf[qty]=v0; //v0æ¯æçè·¯å¾ç"第ä¸ä¸ªé¡¶ç¹"çä¸æ
qty++; //æåçqtyå°±æ¯çäºæçè·¯å¾éç顶ç¹æ°é
//éæ°æ"æ£å顺åº",æå°æçè·¯å¾éçææ顶ç¹
//ä»æ°ç»çæ«å°¾å¼å§æå°
for(k=qty-1 ;k>=1 ; k--)
{
printf("%s-->",c.vexs[PathBuf[k]].name);
}
printf("%s",c.vexs[PathBuf[k]].name);
printf(" æ»è·¯çº¿é¿%dm",D[w0]);
printf("\n\n");
}
}
int main(void)
{
//å建æ¯ç¹å¾
initgraph(&c); //è¾å
¥åæ°æ¯æé
//æ¥çæ¯ç¹é´ç路线
allpath_Floyd(c); //æ¹æ¡1: Floydç®æ³
//allpath_Dijkstra(c); //æ¹æ¡2: Dijkstraç®æ³
//allpath(c); //å代ç [éè¦æ¹å]
return 0;
}
温馨提示:答案为网友推荐,仅供参考