Floyd--景点寻路

#define Mvnum 100
//#define char Vertextype
//#define int Arctype
#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
int messnum=10;
typedef struct message
{
int num;//景点代码
char name[100];//景点名称
char pro[500];//简介
}Ciceroni;
Ciceroni  school[100]={
    {1,"1教A楼\n","学子上英语和文政课的地方10层"},
    {2,"2教B楼\n","学子上理科的地方"},
    {3,"成栋实验楼,信息分院办公室所在地\n","新校区的实验楼,主要是信息院"},
    {4,"老食堂俭德园","老食堂,在老校区,离宿舍楼比较近"},
    {5,"新食堂颐丰园","在新校区的新食堂,食物比较美味,环境优雅"},
    {6,"工科实习中心\n","工科学生金工实习的地方"},
    {7,"帽儿山\n","哈尔滨著名旅游景点,有玻璃桥,风景优雅"},
    {8,"林新体体育馆\n","体育馆,有篮球场羽毛球场,也用作开一些会议和讲座等"},
    {9,"逸夫实验楼\n","逸夫实验基地"},
    {10,"文博楼\n","文博实验基地"},
    {11,"知园\n","花草茂盛,郁郁葱葱的小园林"},
    };
//
typedef struct
{
   char vexs[Mvnum];
    int arcs[Mvnum][Mvnum];
    int vexnum,arcnum;
}AMGraph;
AMGraph NEFU;
int D[Mvnum][Mvnum];
int Path[Mvnum][Mvnum];
void Floyd();
void display();
void update();
void tip()
{   int flag;
  cout<<"\n   **************\n\n   1查询景点信息,\n   2查询两景点最短路径,\n";
    cout<<"   3查询景点到其他景点最短路径,\n   4修改景点信息"<<endl;
    while(cin>>flag)
    {
        if(flag==1)
       display();
         if(flag==2)
     {
           Floyd();
           int a,b;
           cout<<"输入两个景点编号"<<endl;
           cin>>a>>b;
           a--;b--;
           cout<<D[a][b]<<endl;


     }
     if(flag==3)
     {
         Floyd();
         int a;
         cout<<"输入景点编号"<<endl;
         cin>>a;
         a--;
         for(int i=0;i<=messnum;i++)
            cout<<a+1<<"到"<<i+1<<":"<<D[a][i]<<endl;
     }
     if(flag==4)
     {
         update();
     }
      cout<<"\n   **************\n\n   1查询景点信息,\n   2查询两景点最短路径,\n";
    cout<<"   3查询景点到其他景点最短路径,\n   4修改景点信息"<<endl;
    }
}


void Assignment()  //给景点赋值的函数
{char judge;
   for(int i=0;i<=messnum;i++)
   {    for(int j=0;j<=messnum;j++)
       {NEFU.arcs[i][j]=10000000;}//表示无穷}
       NEFU.arcs[i][i]=0;         //就自己而言路径为0;
   }
   NEFU.arcs[1][2]=NEFU.arcs[2][1]=10;
   NEFU.arcs[2][3]=NEFU.arcs[3][2]=70;
   NEFU.arcs[3][5]=NEFU.arcs[5][3]=20;
   NEFU.arcs[2][4]=NEFU.arcs[4][2]=50;
   NEFU.arcs[5][6]=NEFU.arcs[6][5]=300;
   NEFU.arcs[5][7]=NEFU.arcs[7][5]=1000;
   NEFU.arcs[3][8]=NEFU.arcs[8][3]=10;
   NEFU.arcs[3][10]=NEFU.arcs[10][3]=10;
   NEFU.arcs[9][11]=NEFU.arcs[11][9]=15;
   NEFU.arcs[2][11]=NEFU.arcs[11][2]=33;
   NEFU.arcs[6][7]=NEFU.arcs[7][6]=2000;
}


void update()
{char judge;
    int allflag;
    cout<<"1修改信息,2添加信息"<<endl;
    cin>>allflag;




    if(allflag==1){do{
    int id,flag;


    cout<<"请输入要修改的编号"<<endl;
    cin>>id;
    cout<<"请输入修改内容1 景点名称 2景点简介 "<<endl;
     cin>>flag;
     id--;
       if(flag==1)
     { cout<<"输入新景点名称"<<endl;
        cin>>school[id].name;
     }
     if(flag==2)
     {
         cout<<"输入新的景点简介"<<endl;
         cin>>school[id].pro;
     }


  cout<<"是否继续修改(Y/N)"<<endl;
  cin>>judge;


}while(judge=='Y'||judge=='y');
    }




else if(allflag==2)
{  do{
    messnum++;
    cout<<"添加信息编号为:"<<messnum+1<<endl;
    school[messnum].num=messnum+1;
    cout<<"请输入名称"<<endl;
    cin>>school[messnum].name;
    cout<<"请输入简介"<<endl;
    cin>>school[messnum].pro;
    cout<<"是否继续Y/N"<<endl;
    cin>>judge;
}while(judge=='Y'||judge=='y');
}


}




void display()
{
    int m;
    cout<<"请输入你要查询的景点编号,0查询所有";
    cin>>m;
    if(m==0)
    {
        for(int i=0;i<=messnum;i++)
        { cout<<endl;
          cout<<school[i].num<<":"<<school[i].name<<"--->"<<school[i].pro<<endl;
        }
    }
    else
        {
         m--;
         cout<<endl;
          cout<<school[m].num<<":"<<school[m].name<<"--->"<<school[m].pro<<endl;
        }
}






void Floyd()
{         Assignment();
    for(int i=0;i<=messnum;i++)
        for(int j=0;j<=messnum;j++)
    {
        D[i][j]=NEFU.arcs[i][j];
        if(D[i][j]<100000)
            Path[i][j]=-i;
        else  Path[i][j]=-1;
    }
    for(int k=0;k<=messnum;k++)
     for(int i=0;i<=messnum;i++)
         for(int j=0;j<=messnum;j++)
     {
         if(D[i][k]+D[k][j]<D[i][j])
         {D[i][j]=D[i][k]+D[k][j];
         Path[i][j]=Path[k][j];}
     }
}


int main()
{
     Floyd();
    tip();
//for(int i=0;i<=messnum;i++)
//    for(int j=0;j<=messnum;j++)
//    cout<<NEFU.arcs[i][j]<<" ";


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值