標籤:nav sha 部分 cWeb get dtd nod 鄰接矩陣 bar
今天來回顧一下帶權路網的儲存構建方法。 如今交通四通八達,路網密集,從一個地方到達另外一個地方,可以有很多條路徑可以選擇,今天我講的就是路網的連通與不連通以及路線的代價(如路程或者顛簸程度等等作為評估路線的標準,取取值)在電腦中怎麼儲存起來,以及如何再現出來。
假設有6個地點,點與點之間有8條直接相連的道路,那麼在txt檔案中主要分為三部分:
第一部分儲存點數和直接相連的路線數,第二部分儲存點的座標值,第三部分儲存路線(如:2 4 5,表示2號點與4好點直接相連,這條路線分配的權值是5),如左圖。
那麼這些關係如何在程式的結構中表現出來呢?
我們可以用一個數組vertex a[點數]來儲存每個點的座標,數組的下標對應點號;接著用一個二維數組int weight[點數][點數]來對應表示點與點之間的串連關係以及權值,如2 4 5,表示成 weight[2][4]=weight[4][2]=5。
好了,話不多說,直接上代碼吧來得更簡單粗暴一點(調皮臉)~^.^~
#include"stdafx.h"#include<stdlib.h>#include"Graph.h"#include"targetver.h"#define MAX_VERTEX_NUM 20typedef struct Vertex{ double x, y;}vertex;typedef struct Graph{ vertex ver[MAX_VERTEX_NUM]; int weight[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum; int arcnum;}graph;void main(){ graph *G; G = (graph *)malloc(sizeof(graph)); FILE* fp = fopen("information.txt", "r"); if (fp) { fscanf(fp, "%d", &(G->vexnum)); //頂點數 fscanf(fp, "%d", &(G->arcnum)); //邊數 for (int i = 0; i <G->vexnum ; i++) //頂點數組 fscanf(fp, "%lf,%lf", &(G->ver[i].x),&(G->ver[i].y)); int v1, v2, w; //v1,v2從0開始 for (int i = 0; i < G->arcnum ; i++) //構造鄰接矩陣,邊的權值關係 { fscanf(fp, "%d %d %d", &v1, &v2, &w); G->weight[v1][v2] = w; } }fclose(fp); setOrig(0, 0); for (int i = 0; i < G->vexnum; i++) { drawRectangle(G->ver[i].x,G->ver[i].y); char label[5]; sprintf(label, "%d", i); drawText(G->ver[i].x, G->ver[i].y, label); for (int j = 0; j <G->vexnum; j++) { if (G->weight[i][j]>0) { moveTo(G->ver[i].x, G->ver[i].y); lineTo(G->ver[j].x,G->ver[j].y); } } } getchar();}
接下來就是見證奇蹟的時刻!duang~~duang~~duang~~
構建帶權路網