午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    c++查詢最短路徑示例
    來源:易賢網(wǎng) 閱讀:1531 次 日期:2014-08-20 15:41:39
    溫馨提示:易賢網(wǎng)小編為您整理了“c++查詢最短路徑示例”,方便廣大網(wǎng)友查閱!

    這篇文章主要介紹了c++查詢最短路徑示例,需要的朋友可以參考下

    代碼如下:

    //shortest_path.c

    #include

    #include//用file

    #include//可用gets(),puts()

    #include"shortest_path.h"

    #define MAX 32767

    #define MENU "歡迎進入導(dǎo)航系統(tǒng)!n==========菜單===========n0、載入北外地圖n1、建立地圖n2、查詢最短路徑n3、退出n==========菜單===========n"

    struct stmap map;//無向網(wǎng)

    const char *filepath1="D:spots.dat";

    const char *filepath2="D:paths.dat";

    int load1()

    {

    FILE *fp;

    int i;

    fp=fopen(filepath1,"r");

    if(fp==NULL){printf("spots文件打開異常,讀取失敗");return -1;}

    fread(&map.spotnum,sizeof(int),1,fp);

    for(i=0;i

    {

    fread(map.spot[i].name,sizeof(char),10,fp);

    fread(map.spot[i].intro,sizeof(char),20,fp);

    }

    fclose(fp);

    return 0;

    }

    int load2()

    {

    FILE *fp;

    int i,j;

    fp=fopen(filepath2,"r");

    if(fp==NULL){printf("paths文件打開異常,讀取失敗");return -1;}

    fread(&map.pathmatrix,sizeof(int),1,fp);

    for(i=0;i

    for(j=0;j

    fread(&map.pathmatrix[i][j],sizeof(int),1,fp);

    fclose(fp);

    return 0;

    }

    void loadmap()

    {

    if(load1()==0)

    printf("spot讀入成功n");

    else

    printf("spot讀入失敗n");

    if(load2()==0)

    printf("path讀入成功n");

    else

    printf("path讀入失敗n");

    }

    void drawmap()//直接輸入

    {

    int i;

    int a,b;

    char s1[10],s2[10];

    printf("共有幾個景點?(<=20)");//map.spotmun

    fflush(stdin);

    scanf("%d",&map.spotnum);

    printf("共有幾條景點與景點之間直接相連的路徑?");//map.pathnum

    fflush(stdin);//清空鍵盤緩沖區(qū),在"stdio.h"中

    scanf("%d",&map.pathnum);

    for(a=0;a

    for(b=0;b

    {

    if(a==b)map.pathmatrix[a][b]=0;

    else map.pathmatrix[a][b]=MAX;

    }

    for(i=0;i

    printf("請輸入第%d個景點的名稱(<=10letters)",i+1);

    fflush(stdin);

    gets(map.spot[i].name);

    printf("請輸入第%d個景點的介紹(<=20letters)",i+1);

    fflush(stdin);

    gets(map.spot[i].intro);

    }//輸入景點名字和簡介map.spot[].name;map.spot[].intro

    for(i=0;i

    do{

    printf("請輸入第%d條路徑的起點",i+1);

    fflush(stdin);

    gets(s1);

    for(a=0;a

    if(!strcmp(map.spot[a].name,s1))break;//查找景點編號

    if(a==map.spotnum)printf("不存在此景點,請重新輸入。n");

    }while(a==map.spotnum);

    do{

    printf("請輸入第%d條路徑的終點",i+1);

    fflush(stdin);

    gets(s2);

    for(b=0;b

    if(!strcmp(map.spot[b].name,s2))break;

    if(b==map.spotnum)printf("不存在此景點,請重新輸入。n");

    }while(b==map.spotnum);

    printf("請輸入第%d條路徑的長度",i+1);

    fflush(stdin);

    scanf("%d",&map.pathmatrix[a][b]);

    map.pathmatrix[b][a]=map.pathmatrix[a][b];//輸入路徑長度

    }

    }

    void shortestpath()//最短路徑,輸入起點終點輸出路徑和路程

    {

    struct stspath spath[20];

    int s,t,v,w,min;

    char s1[10],s2[10];

    int pathorder[20];

    struct stspath *p;//pathorder

    do{

    printf("請輸入起點");//查找起點的景點編號

    fflush(stdin);

    gets(s1);

    for(s=0;s

    if(!strcmp(map.spot[s].name,s1))break;

    if(s==map.spotnum)printf("不存在此景點,請重新輸入。n");

    }while(s==map.spotnum);

    do{

    printf("請輸入終點");//查找終點的景點編號

    fflush(stdin);

    gets(s2);

    for(t=0;t

    if(!strcmp(map.spot[t].name,s2))break;

    if(t==map.spotnum)printf("不存在此景點,請重新輸入。n");

    }while(t==map.spotnum);

    for(v=0;v

    {

    spath[v].length=MAX;

    spath[v].in=0;

    }

    spath[s].in=1;

    spath[s].length=0;

    spath[s].pior=NULL;

    v=s;

    while(v!=t){

    for(w=0;w

    if((!spath[w].in)&&(spath[w].length>spath[v].length+map.pathmatrix[v][w])){

    spath[w].length=spath[v].length+map.pathmatrix[v][w];

    spath[w].pior=&spath[v];

    }

    min=MAX;

    for(w=0;w

    if((!spath[w].in)&&(spath[w].length

    min=spath[w].length;

    v=w;

    }

    spath[v].in=1;

    }

    printf("最短路徑長度為%d,最短路徑為:n",spath[t].length);//print path

    for(v=0,p=&spath[t];p->pior!=NULL;p=p->pior)

    {

    pathorder[v]=p-spath;

    v++;

    }

    pathorder[v]=s;

    for(;v>=0;v--)

    printf("%10s",map.spot[pathorder[v]].name);

    }

    void main()

    {

    int menu=1;

    printf(MENU);

    while(menu!=3)

    {

    printf("n請輸入您的選項(數(shù)字)n");

    fflush(stdin);

    scanf("%d",&menu);

    switch (menu)

    {

    case 0: loadmap();printf("n北外地圖載入完成n");break;

    case 1: drawmap();printf("n新建完成n");break;

    case 2: shortestpath();printf("n查詢完成完成n");break;

    }

    }

    printf("謝謝使用!");

    }

    2. [文件] shortest_path.h ~ 430B 下載(2)

    #ifndef _SHORTEST_PATH_H_

    #define _SHORTEST_PATH_H_

    struct stspot{//景點的頂點

    char name[11];//景點名稱no more than 10

    char intro[20];//景點介紹no more than 20

    };

    struct stmap{//整個無向網(wǎng)

    stspot spot[20];//點,景點向量

    int pathmatrix[20][20];//邊,路徑的鄰接矩陣

    int spotnum;

    int pathnum;

    };

    struct stspath//求最短路徑時的景點數(shù)組

    {

    stspath * pior;

    int in;// can be boolen

    int length;

    };

    #endif

    名單

    更多信息請查看IT技術(shù)專欄

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機網(wǎng)站地址:c++查詢最短路徑示例

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)