天天看點

c語言自動生成鄰接矩陣,求助關于圖的矩陣表示的程式(離散數學)用c語言編寫,能夠實作下列功能.任意給定一個圖,能夠求得此圖的鄰接矩陣,距離矩陣,可達矩陣,關聯矩陣.任意給定一個圖,能夠判斷這個圖是否是...

// z2.cpp :Defines the entry point for the console application.

//

#include "stdafx.h"

//#include

//void main()

//{

#define MAXNUM 30

#define INFINITY 10000

#define FALSE 0

#define TRUE 1

#define BACK -1

#include "stdio.h"

#include

#include "malloc.h"

typedef struct{

char vexs[MAXNUM];

int edges[MAXNUM][MAXNUM];

int n,e;

}Mgraph;

void CreateGraph(Mgraph *g)

{

int i,j,k,w;

char ch;

printf("請輸入結點數與弧數,如:3,2:");

scanf("%d,%d",&(g->n),&(g->e));

for(i=0;in;i++)

{

for(j=0;jn;j++)

{

if(i==j){

g->edges[i][j]=0;

}else

{

g->edges[i][j]=INFINITY;

}

}

}

//擷取權值

printf("\n為友善示範,結點内容預設為結點序号,無需輸入.\n\n下面請輸入弧及權值,例如:若點0到1有弧可達,且權值為10,則輸入:0,1,10.注意:輸入時不區分弧的順序.\n");

for(k=0;ke;k++){

printf("\t請輸入第%d個弧及權值:",k+1);

scanf("%d,%d,%d",&i,&j,&w);

g->edges[i][j]=w;

}

//輸出鄰接矩陣

printf("\n鄰接矩陣:\n",k);

for(i=0;in;i++){

printf("\t");

for(j=0;jn;j++){

if(g->edges[i][j]>=INFINITY){

printf("∞\t");

}else{

printf("%d\t",g->edges[i][j]);

}

}

printf("\n");

}

}

void ShortPath(Mgraph *g,int v0)

{

int i,j,v,w,min;

int R[MAXNUM][MAXNUM];

int iterator[MAXNUM];

int D[MAXNUM];

int final[MAXNUM];

//初始化遊标為零

for(i=0;in; ++v){

final[v] = FALSE;

D[v] = g->edges[v0][v];

}

//初始化v0的路徑距離為零,設定已擷取最短路徑

D[v0] = 0;

final[v0] = TRUE;

//主循環,擷取其他的最短路徑

for(i = 1;i < g->n; ++i){

min = INFINITY;

//尋找最小的D[w]

for(w = 0;w < g->n; ++w){

if(final[w] != TRUE){

if(D[w]n; ++w){

if((final[w] != TRUE) && (min+g->edges[v][w] < D[w])){

//更新路徑

iterator[w]=iterator[v];

for(j=0;jedges[v][w];

}

}

}

//若final始終為FALSE,則不可達

for(w = 0;wn; ++w){

if(final[w] != TRUE){

printf("\t點%d到點%d不可達\n",v0,w);

}

}

}

//主方法

void main()

{

Mgraph * g;

int i=0;

g=(Mgraph *)malloc(sizeof(Mgraph));

printf("該程式實作了Dijkstra算法,支援路徑顯示,請按提示輸入資料:\n\n");

CreateGraph(g);

printf("\n最小路徑判斷(以0點為起點):\n");

ShortPath(g,0);

getchar();

}

解析看不懂?求助智能家教解答檢視解答