2.提供圖中任意地點(diǎn)相關(guān)信息的查詢(xún)。
提供圖中任意地點(diǎn)的問(wèn)路查詢(xún),即查詢(xún)?nèi)我鈨蓚€(gè)地點(diǎn)之間的一條最短路徑。
學(xué)校要新建一間超市,請(qǐng)為超市選址,實(shí)現(xiàn)總體最優(yōu)。注意要考慮各地點(diǎn)距離超市的遠(yuǎn)近,以及大家去超市的頻度不同。
#include#include#define N 16 //圖的頂點(diǎn)的數(shù)量
typedef struct place{char* name;//名稱(chēng)
int codename;//代號(hào)
char* introduction;//簡(jiǎn)介
double frequncy;//去超市的頻率
}place,mall;//創(chuàng)建地點(diǎn)
//place---buildings
typedef struct path{int length;
char pathName[10];
int start;//開(kāi)始節(jié)點(diǎn)的坐標(biāo)
int finish;
int turn[N];
int index;
}path;
typedef struct Map{// place p[N+1];//頂點(diǎn)的類(lèi)型
path arcs[N+1][N+1];//distance from one to another
int vernum,arcnum;
}Map;
//給圖加入路徑長(zhǎng)度
void initMap(Map *mapp,int distance,int start,int finish){mapp->arcs[start][finish].length=distance;
mapp->arcs[finish][start].length=distance;
}
void initplace(place *p,int codename,char name[10],char introduction[100],double fre){p->name=name;
p->codename=codename;
p->introduction=introduction;
p->frequncy=fre;
}
void initfrequency(place *p,double e){p->frequncy=e;
}
void printMap(Map p){printf("the Adjacency matrix is as follows");
int i,j;
for(i=0;ifor(j=0;j//遍歷以上的二維矩陣
if(p.arcs[i][j].length==-1){printf("#\t");
}else{printf("%d\t",p.arcs[i][j]);
}
}
printf("\n");
}
printf("The adjacency matrix is printed successfully\n");
printf("the num of paths in the map is %d \n",p.arcnum);
printf("the num of places in this map is %d\n",p.vernum);
}
// mappp.arcs[k][j]是最原始的鄰接矩陣
void flody(Map mappp,int newmap[N][N])
{int k, i, j;
for (k = 1; k<= N; k++)//在n個(gè)結(jié)點(diǎn)中依次找中轉(zhuǎn)站;
{for (i = 1; i<= N; i++)
{ for (j = 1; j<= N; j++)
{ newmap[i][j]=mappp.arcs[i][j].length;
if(mappp.arcs[i][k].length<1000&& mappp.arcs[k][j].length<1000){//如果中轉(zhuǎn)點(diǎn)存在
if (mappp.arcs[i][j].length >mappp.arcs[i][k].length + mappp.arcs[k][j].length)//如果直接從i到j(luò)的距離大于從i到k再到j(luò)的距離,即找到一個(gè)合適的中轉(zhuǎn)站,就更新地圖;
{mappp.arcs[i][j].length = mappp.arcs[i][k].length + mappp.arcs[k][j].length;
newmap[i][j]=mappp.arcs[i][j].length;
}
}
}
}
}
//對(duì)角線(xiàn)元素是0
for (int i=1; i<=N; i++)
{for (int k=1; k<=N; k++)
{if (i==k)
{newmap[i][k]=0;
}
}
}
}
int main()
{//4-------4
double weigh;
double minpp;
int mallp;
int mall,dis,start4;
double w[N+1];
//4-----------4
//1-----------------1
int i,start,finish;
double j;
place placep[N+1];
//1----------------------1
int placenum;
//3-------------------3
int newmap[N][N];
int minp,minum,cnt,f;
int n;
int startp,finishp,turn; int pathp[N];
//1.設(shè)計(jì)平面圖
//1.1創(chuàng)建地點(diǎn)的結(jié)點(diǎn)
//各個(gè)地點(diǎn)的信息組成的數(shù)組
//initplace(placep[1],1,'qizhi1','grilshome');initplace(placep[2],2,'qizhi2','girlshome');initplace(placep[3],3,'qizhi3','girlshome');
for(i=1;i<=N;i++){j=0.0;
initplace(&placep[i],i,"name","introduction",j);
}
Map mapp;
//鄰接矩陣的初始化操作
for(start=1;start<=N;start++){for(finish=1;finish<=N;finish++){mapp.arcs[start][finish].length=-1;
}
}
for(i=1;i<=N;i++){for(j=1;j<=N;j++){initMap(&mapp,0x3f3f3f3f,i,j);
}
}
//1.2創(chuàng)建路徑
initMap(&mapp,6,1,9);initMap( &mapp,7,9,15);initMap( &mapp,4,1,8);initMap(&mapp,1,7,8);initMap( &mapp,4,7,11);
initMap(&mapp,2,7,12);initMap(&mapp,6,1,6);initMap( &mapp,1,1,2);initMap(&mapp,3,2,3);initMap( &mapp,2,3,5);
initMap(&mapp,4,3,4);initMap( &mapp,2,5,13);initMap(&mapp,6,4,14);initMap(&mapp,4,4,10);initMap(&mapp,1,10,14);
initMap(&mapp,6,9,1);initMap( &mapp,7,15,9);initMap( &mapp,4,8,1);initMap(&mapp,1,8,7);initMap( &mapp,4,11,7);
initMap(&mapp,2,12,7);initMap(&mapp,6,6,1);initMap( &mapp,1,2,1);initMap(&mapp,3,3,2);initMap( &mapp,2,5,3);
initMap(&mapp,4,4,3);initMap( &mapp,2,13,5);initMap(&mapp,6,14,4);initMap(&mapp,4,10,4);initMap(&mapp,1,14,10);
initMap(&mapp,6,1,16);initMap(&mapp,6,16,1);
// 2.1 相關(guān)信息的查詢(xún)操作
printf("現(xiàn)在進(jìn)入查詢(xún),請(qǐng)輸入想要查詢(xún)的地址代號(hào),(輸入范圍是%d~%d)\n",1,N);
scanf("%d",&placenum);
printf("您查詢(xún)的地點(diǎn)代號(hào)是%d,名稱(chēng)是%s,簡(jiǎn)介是%s,去超市的頻率是%f",placep[placenum].codename,placep[placenum].name,placep[placenum].introduction,placep[placenum].frequncy);
//3.1問(wèn)路查詢(xún)
printf("現(xiàn)在進(jìn)入問(wèn)路查詢(xún)界面,請(qǐng)您按照2 4的形式輸入起點(diǎn)和終點(diǎn)的地址代號(hào) (輸入范圍是%d~%d)比如4 14\n",1,N);
//輸入1、 2、 3 ~ N之類(lèi)的代號(hào)
flody(mapp,newmap);
//存放最短路徑
turn=0;
n=N;
while(n)
{pathp[n--]=0;}
scanf("%d %d",&startp,&finishp);
printf("從地點(diǎn)%d到地點(diǎn)%d的最短路徑為%d\n",startp,finishp,newmap[startp][finishp]);
printf("路徑如下所示:\n");
minp=100;//尋找最短路,先假設(shè)這條路徑長(zhǎng)度大,經(jīng)過(guò)每一個(gè)點(diǎn)后更新長(zhǎng)度,最后長(zhǎng)度等于最短路
minum;
cnt=2;
f=startp;//f是已經(jīng)確定的最短路經(jīng)過(guò)的點(diǎn),在f的鄰接點(diǎn)中找到點(diǎn)minum,使得newmap[first][f]+map[f][minum]+newmap[minnum][last]=最短路
while(minp>=newmap[startp][finishp])
{for (i=1;i<=N;i++)
{if ((newmap[startp][f]+mapp.arcs[f][i].length+newmap[i][finishp])<=minp){minum=i;
minp=newmap[startp][f]+mapp.arcs[f][minum].length+newmap[minum][finishp];
}
}
f=minum;
pathp[cnt++]=minum;
if (minum==finishp){break;
}
}
printf("%d ",startp);
pathp[cnt]=finishp;
for(i=1; iif (pathp[i]!=pathp[i-1] && pathp[i]!=0)
{printf("%d ",pathp[i]);
}
}
printf("\n");
// printf("%d\n",mapp.arcs[startp][finishp].index);
// printf("%d\n",mapp.arcs[startp][finishp].turn[mapp.arcs[startp][finishp].index]);
// if(mapp.arcs[startp][finishp].turn[mapp.arcs[startp][finishp].index]!=0)//當(dāng)有中轉(zhuǎn)點(diǎn)的時(shí)候
// {// printf("%d-->",startp);
// for(int i=1; i// printf("%d",mapp.arcs[i][finishp].turn[mapp.arcs[i][finishp].index]);
// if( i<=mapp.arcs[startp][finishp].index ) printf("-->");
//
// }
// printf("%d",finishp);
// }
// else{// printf("%d-->%d",startp,finishp);
// }
// printf("\n");
//之前寫(xiě)的place placep[N+1];//各個(gè)地點(diǎn)的信息組成的數(shù)組
//4.1超市選址
initfrequency(&placep[6],0.9);
initfrequency(&placep[2],0.1);
for(mall=1;mall<=N;mall++){w[mall]=0;};
for(mall=1;mall<=N;mall++){weigh=0;//mall是新超市的所在建筑的代號(hào)
for(start4=1;start4<=N;start4++){dis=newmap[start4][mall];
if(start4==mall) dis=0;
weigh+=dis*placep[start4].frequncy;
// printf("%lf %d %d %lf\n",placep[start].frequncy,mall,dis,weigh);
}
w[mall]=weigh;
// printf("%lf\n",w[mall]);
}
mallp=1;
minpp=w[mallp];
for(int i=1;i<=N;i++){if(minpp>w[i]){minpp=w[i];
mallp=i;
}
}
printf("超市建在代號(hào)為%d的位置最好",mallp);
system("pause");
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱(chēng):數(shù)據(jù)結(jié)構(gòu)超市選址、最短路徑查詢(xún)、地址信息查詢(xún)-創(chuàng)新互聯(lián)
新聞來(lái)源:http://jinyejixie.com/article0/dsehoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站策劃、企業(yè)建站、ChatGPT、面包屑導(dǎo)航、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容