日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Floyd算法应用-医院选址问题

發(fā)布時(shí)間:2023/12/1 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Floyd算法应用-医院选址问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1)問(wèn)題描述

n個(gè)村莊之間的交通圖可以用有向網(wǎng)圖來(lái)表示,圖中邊<vi, vj>上的權(quán)值表示從村莊i到村莊j的道路長(zhǎng)度?,F(xiàn)在要從這n個(gè)村莊中選擇一個(gè)村莊新建一所醫(yī)院,問(wèn)這所醫(yī)院應(yīng)建在哪個(gè)村莊,才能使所有的村莊離醫(yī)院都比較近?

2) 基本要求

(1) 建立模型,設(shè)計(jì)存儲(chǔ)結(jié)構(gòu);

(2) 設(shè)計(jì)算法完成問(wèn)題求解;

(3) 分析算法的時(shí)間復(fù)雜度。

3) 設(shè)計(jì)思想

醫(yī)院選址問(wèn)題實(shí)際是求有向圖中心點(diǎn)的問(wèn)題。首先定義頂點(diǎn)的偏心度。

設(shè)圖G=(V,E),對(duì)任一頂點(diǎn)k,稱(chēng)E(k)=max{d(i, k)}(i∈V)為頂點(diǎn)k的偏心度。顯然,偏心度最小的頂點(diǎn)即為圖G的中心點(diǎn)。

如圖3(a)所示是一個(gè)帶權(quán)有向圖,其各頂點(diǎn)的偏心度如圖(b)所示。

?

4)醫(yī)院選址問(wèn)題的算法用偽代碼描述如下:

1.對(duì)加權(quán)有向圖,調(diào)用Floyd算法,求每對(duì)頂點(diǎn)間最短路徑長(zhǎng)度的矩陣;

2.對(duì)最短路徑長(zhǎng)度矩陣的每列求大值,即得到各頂點(diǎn)的偏心度;

3.具有最小偏心度的頂點(diǎn)即為所求。

5)代碼附錄

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define INFINITY 1000000 5 #define MAX_VERTEX_NUM 20 6 7 //定義弧的權(quán)值信息 8 typedef struct Arccell 9 { 10 int adj; //權(quán)值 11 } Arccell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //圖的鄰接矩陣 12 //定義結(jié)點(diǎn)信息 13 typedef struct VertexInfo 14 { 15 char name[20];//結(jié)點(diǎn)[村莊]名稱(chēng) 16 int position;//定點(diǎn)編號(hào) 17 } VertexInfo; 18 //圖的結(jié)構(gòu) 19 typedef struct Mgraph 20 { 21 VertexInfo vexs[MAX_VERTEX_NUM];//頂點(diǎn)數(shù)組 22 AdjMatrix arcs;//鄰接矩陣 23 int vernum,arcnum;//分別指定頂點(diǎn)數(shù)和邊數(shù) 24 } Mgraph; 25 26 27 //對(duì)圖的初始化 28 Mgraph initgraph() 29 { 30 Mgraph c; 31 printf("請(qǐng)輸入該圖的頂點(diǎn)個(gè)數(shù)和弧的個(gè)數(shù):\n"); 32 printf("頂點(diǎn)個(gè)數(shù):"); 33 scanf("%d",&c.vernum); 34 printf("弧的個(gè)數(shù):"); 35 scanf("%d",&c.arcnum); 36 //依次設(shè)置頂點(diǎn)編號(hào) 37 for(int i=0; i<c.vernum; i++) 38 { 39 c.vexs[i].position=i; 40 } 41 //依次輸入各頂點(diǎn)信息 42 /* 43 strcpy(c.vexs[0].name,"a"); 44 strcpy(c.vexs[1].name,"b"); 45 strcpy(c.vexs[2].name,"c"); 46 strcpy(c.vexs[3].name,"d"); 47 strcpy(c.vexs[4].name,"e"); 48 49 */ 50 printf("\n請(qǐng)依次輸入各個(gè)村莊的名稱(chēng):\n"); 51 for(int i=0;i<c.vernum;i++) 52 { 53 printf("村莊%d:",i); 54 scanf("%s",&c.vexs[i].name); 55 56 } 57 58 //依次設(shè)置各弧的信息 59 for(int i=0; i<c.vernum; i++) 60 { 61 //先初始化鄰接矩陣,相同點(diǎn)設(shè)置為0,其他全部設(shè)置為INFINITY(無(wú)窮大) 62 for(int j=0; j<c.vernum; j++) 63 { 64 c.arcs[i][j].adj=INFINITY; 65 if(i==j) 66 { 67 c.arcs[i][j].adj=0; 68 } 69 } 70 } 71 //再依次輸入需要設(shè)置的權(quán)值 72 int i,j,k; 73 printf("請(qǐng)輸入需要設(shè)置的弧長(zhǎng)及其兩端頂點(diǎn)[輸入3個(gè)0結(jié)束]:\n"); 74 while(scanf("%d%d%d",&i,&j,&k)) 75 { 76 if(i==0&&j==0&k==0) 77 break; 78 c.arcs[i][j].adj=k; 79 } 80 /* 81 c.arcs[0][1].adj=1; 82 c.arcs[1][2].adj=2; 83 c.arcs[2][3].adj=2; 84 c.arcs[2][4].adj=4; 85 c.arcs[3][1].adj=1; 86 c.arcs[3][2].adj=3; 87 c.arcs[4][3].adj=5; 88 */ 89 return c; 90 } 91 92 //輸出鄰接矩陣 93 void printMatrix(Mgraph c) 94 { 95 printf("該圖的鄰接矩陣如下所示:\n"); 96 int count=0;//用于計(jì)數(shù) 97 for(int i=0; i<c.vernum; i++) 98 for(int j=0; j<c.vernum; j++) 99 { 100 if(c.arcs[i][j].adj==INFINITY) 101 printf(" #"); 102 else 103 printf("%4d",c.arcs[i][j].adj); 104 count++; 105 if(count%c.vernum==0) 106 printf("\n"); 107 } 108 } 109 110 void ShortestPath_Floyd(Mgraph G,int dis[][MAX_VERTEX_NUM]) 111 { 112 //用floyd算法求有向網(wǎng)G中各對(duì)定點(diǎn)v和w之間的最短路徑及其帶權(quán)長(zhǎng)度dis[v][w] 113 for(int v=0; v<G.vernum; v++) 114 for(int w=0; w<G.vernum; w++) 115 { 116 //對(duì)各結(jié)點(diǎn)之間初始化已知距離 117 dis[v][w]=G.arcs[v][w].adj; 118 } 119 120 for(int u=0; u<G.vernum; u++) 121 for(int v=0; v<G.vernum; v++) 122 for(int w=0; w<G.vernum; w++) 123 { 124 if(dis[v][u]+dis[u][w]<dis[v][w]) 125 { 126 //從v經(jīng)u到w的路徑更短 127 dis[v][w]=dis[v][u]+dis[u][w]; 128 } 129 } 130 131 } 132 //輸出距離矩陣 133 void printDis(Mgraph G,int dis[MAX_VERTEX_NUM][MAX_VERTEX_NUM]) 134 { 135 printf("\n經(jīng)過(guò)Flyod算法之后各頂點(diǎn)之間的距離如下:\n"); 136 for(int i=0; i<G.vernum; i++) 137 { 138 for(int j=0; j<G.vernum; j++) 139 { 140 if(dis[i][j]>=1000000) 141 printf(" #"); 142 else 143 printf("%4d",dis[i][j]); 144 145 } 146 printf("\n"); 147 } 148 } 149 150 //得到偏心度degree[]數(shù)組 151 void getDegree(Mgraph G,int dis[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int degree[]) 152 { 153 for(int i=0;i<G.vernum;i++) 154 { 155 int max=dis[0][i]; 156 for(int j=0;j<G.vernum;j++) 157 { 158 if(dis[j][i]>max) 159 max=dis[j][i]; 160 } 161 degree[i]=max; 162 } 163 } 164 165 166 167 int main() 168 { 169 printf("**********歡迎使用醫(yī)院選址系統(tǒng)*********\n"); 170 Mgraph c=initgraph(); 171 system("cls"); 172 173 //輸出鄰接矩陣 174 getchar(); 175 printMatrix(c); 176 177 //定義距離數(shù)組,調(diào)用Floyd算法得到結(jié)果 178 int dis[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 179 ShortestPath_Floyd(c,dis); 180 181 //輸出各個(gè)頂點(diǎn)之間的距離矩陣 182 getchar(); 183 printDis(c,dis); 184 185 //存放偏心度數(shù) 186 int degree[c.vernum]; 187 getDegree(c,dis,degree); 188 189 //顯示各頂點(diǎn)的偏心度 190 getchar(); 191 printf("\n各頂點(diǎn)的偏心度如下所示:\n"); 192 for(int i=0;i<c.vernum;i++) 193 { 194 if(degree[i]>=1000000) 195 printf(" #\n"); 196 else 197 printf("%4d\n",degree[i]); 198 } 199 200 //得到最小村莊的編號(hào)和名稱(chēng) 201 int num; 202 int min=degree[0]; 203 for(int i=0;i<c.vernum;i++) 204 { 205 if(min>degree[i]) 206 min=degree[i]; 207 } 208 209 for(int i=0;i<c.vernum;i++) 210 { 211 if(min==degree[i]) 212 { 213 num=i; 214 break; 215 } 216 } 217 getchar(); 218 printf("\n偏心度最小的村莊編號(hào):%4d\n",num);//輸出偏心度最小的村莊編號(hào) 219 printf("醫(yī)院應(yīng)該建立在村莊: %4s \n",c.vexs[num].name); 220 return 0; 221 222 }

6)測(cè)試結(jié)果

1.首先運(yùn)行程序,出現(xiàn)如圖6.1所示。

?

         ?圖6.1? 程序運(yùn)行開(kāi)始界面

2.輸入頂點(diǎn)個(gè)數(shù)和邊的個(gè)數(shù)之后,會(huì)提示輸入村莊名稱(chēng),如圖6.2所示。

?

??????????????????????? 圖6.2 提示輸入村莊名稱(chēng)界面

3.村莊名稱(chēng)輸入結(jié)束之后,提示輸入邊的起始點(diǎn)和權(quán)值,如圖6.3所示。

?

?? ?????????????????????圖6.3 提示輸入邊相關(guān)信息的界面

4.輸入邊的信息,以輸入0 0 0結(jié)束,如圖6.4所示。

?

??????????????????????? 圖6.4 輸入邊相關(guān)信息界面

5.邊的信息輸入完成之后,回車(chē)得到鄰接矩陣,如圖6.5所示。

?

?????????????????????????? 圖6.5 鄰接矩陣表

6.繼續(xù)回車(chē),得到距離矩陣,如圖6.6所示。

?

?????????????????????????? 圖6.6 距離矩陣表

7.回車(chē),得到偏心度表,如圖6.7所示。

?

?????????????????????????? 圖6.7 各頂點(diǎn)偏心度

8.最后程序輸出醫(yī)院選址結(jié)果,如圖6.8所示。

?

???????????????????????????? 圖6.8 最終結(jié)果

轉(zhuǎn)載于:https://www.cnblogs.com/wujiyang/p/4491750.html

總結(jié)

以上是生活随笔為你收集整理的Floyd算法应用-医院选址问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。