最短路-大作业

#include<stdio.h>
#include<string.h>
#define N 21
#define null 0x3f3f3f3f
int n=15, m;
int g[N][N];
typedef struct{
    int num;
    char *data;
}place;
place places[N];
int min(int k,int g)
{
    return k<g? k:g;
}
void floyd()
{
    for(int k = 1; k <= n; k ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
            {
                int t = g[i][k] + g[k][j];
                g[i][j]=min(g[i][j],t);
                //if(t < g[i][j])  g[i][j] = t;
            }
}
int main()
{

    memset(g, null, sizeof g);
    //初始化,假设两点之间路程无限远

    for(int i = 1; i <= n; i ++)  g[i][i] = 0;
    //地点到自己本事距离为零

    //char name[N]name="一食堂";
    char name1[]="一食堂";
    places[1].data=name1;
    char name2[]="二食堂";
    places[2].data=name2;
    char name3[]="三食堂";
    places[3].data=name3;
    char name4[]="四食堂";
    places[4].data=name4;
    char name5[]="五食堂";
    places[5].data=name5;
    char name6[]="操场";
    places[6].data=name6;
    char name7[]="公教楼";
    places[7].data=name7;
    char name8[]="国培";
    places[8].data=name8;
    char name9[]="红馆";
    places[9].data=name9;
    char name10[]="白馆";
    places[10].data=name10;
    char name11[]="软件学院";
    places[11].data=name11;
    char name12[]="北门";
    places[12].data=name12;
    char name13[]="西门";
    places[13].data=name13;
    char name14[]="诚朴园";
    places[14].data=name14;
    char name15[]="启智园";
    places[15].data=name15;


    g[1][2]=1;
    //eg.一食堂到二食堂距离为1;
    g[2][3]=1;
    g[3][4]=10;
    g[4][5]=1;
    g[5][6]=6;
    g[6][7]=4;
    g[7][8]=3;
    g[8][9]=10;
    g[9][10]=1;
    g[10][11]=3;
    g[11][12]=5;
    g[12][13]=6;
    g[13][14]=7;
    g[14][15]=8;
    for(int i=1;i<=14;i++)
        g[i+1][i]=g[i][i+1];
    //两点距离对称
    g[4][6]=4;
    g[6][4]=4;
    g[11][15]=5;
    g[15][11]=5;
    g[1][13]=7;
    g[13][1]=7;
    g[14][6]=15;
    g[6][14]=15;
    //补充路径


    floyd();
    //floyd算法求最短路

    int k;
    printf("查询地点名称请输入1,查询两地之间最短距离请输入2\n");
    scanf("%d",&k);
    if(k==1)
    {
        printf("请输入查询的地点标号");
        int num;
        scanf("%d",&num);
        printf("地点%d的名字叫作%s",num,places[num].data);
    }
    if(k==2)
    {
        int start,end;
        printf("请输入出发的地点标号");
        scanf("%d",&start);
        printf("请输入结束的地点标号");
        scanf("%d",&end);
        printf("%s到%s的最短路径为%d米\n",places[start].data,places[end].data,g[start][end]);
    }

    return 0;
}
#include<stdio.h>
#include<string.h>
#include <stdlib.h>

#define N 21
#define null 0x3f3f3f3f
int n=15, m;
int g[N][N];//路径矩阵
typedef struct{
    int f;//去超市的频率
    int num;//标号
    char *data;//地点名称
    char *imfomation;//简介
}place;
place places[N];
int min(int k,int g)
{
    return k<g? k:g;
}
int max(int k,int g)
{
    return k>g? k:g;
}
void floyd()
{
    for(int k = 1; k <= n; k ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
            {
                int t = g[i][k] + g[k][j];
                g[i][j]=min(g[i][j],t);
                //if(t < g[i][j])  g[i][j] = t;
            }
}
void get_shop_place()
{
    int Min=0x3f3f3f3f,Min_place=1;
     for(int k = 1; k <= n; k ++)
     {
         int cnt=0;
         for(int i = 1; i <= n; i ++)
            {
                if(k!=i)
                {
                    cnt+=(g[i][k]*places[i].f);
                }
            }
        printf("地点%d的名字叫作%s,该地点作为超市的距离的远近与频率为加权值为%d\n",k,places[k].data,cnt);
        if(cnt<Min)
            Min_place=k;
        Min=min(Min,cnt);
     }
     printf("所以,最合适的超市位置为地点%d%s\n",Min_place,places[Min_place].data);

}
int main()
{

    memset(g, null, sizeof g);
    //初始化,假设两点之间路程无限远

    for(int i = 1; i <= n; i ++)  g[i][i] = 0;
    //地点到自己本事距离为零

    //char name[N]name="一食堂";
    char name1[]="一食堂";
    places[1].data=name1;
    char name2[]="二食堂";
    places[2].data=name2;
    char name3[]="三食堂";
    places[3].data=name3;
    char name4[]="四食堂";
    places[4].data=name4;
    char name5[]="五食堂";
    places[5].data=name5;
    char name6[]="操场";
    places[6].data=name6;
    char name7[]="公教楼";
    places[7].data=name7;
    char name8[]="国培";
    places[8].data=name8;
    char name9[]="红馆";
    places[9].data=name9;
    char name10[]="白馆";
    places[10].data=name10;
    char name11[]="软件学院";
    places[11].data=name11;
    char name12[]="北门";
    places[12].data=name12;
    char name13[]="西门";
    places[13].data=name13;
    char name14[]="诚朴园";
    places[14].data=name14;
    char name15[]="启智园";
    places[15].data=name15;
    char imfomation1[]="一食堂饭菜便宜";
    places[1].imfomation=imfomation1;
    char imfomation2[]="二食堂脆皮鸡好吃";
    places[2].imfomation=imfomation2;
    char imfomation3[]="三食堂环境优美";
    places[3].imfomation=imfomation3;
    char imfomation4[]="四食堂性价高";
    places[4].imfomation=imfomation4;
    char imfomation5[]="五食堂花里胡哨";
    places[5].imfomation=imfomation5;
    char imfomation6[]="操场晚上有活动";
    places[6].imfomation=imfomation6;
    char imfomation7[]="公教楼学习圣地";
    places[7].imfomation=imfomation7;
    char imfomation8[]="国培吃喝玩乐";
    places[8].imfomation=imfomation8;
    char imfomation9[]="红馆打乒乓球";
    places[9].imfomation=imfomation9;
    char imfomation10[]="白馆打羽毛球";
    places[10].imfomation=imfomation10;
    char imfomation11[]="软件学院全是帅哥美女";
    places[11].imfomation=imfomation11;
    char imfomation12[]="北门川流不息";
    places[12].imfomation=imfomation12;
    char imfomation13[]="西门没有外卖";
    places[13].imfomation=imfomation13;
    char imfomation14[]="诚朴园人杰地灵";
    places[14].imfomation=imfomation14;
    char imfomation15[]="启智园举世无双";
    places[15].imfomation=imfomation15;
    for(int i = 1; i <= n; i ++)
    {
        int f=i*i%10;
        places[i].num=i;
        //设置标号
        places[i].f=f;
        //设置该地点去超市的频率
    }
    //places[14].f=10;

    g[1][2]=1;
    //eg.一食堂到二食堂距离为1;
    g[2][3]=1;
    g[3][4]=10;
    g[4][5]=1;
    g[5][6]=6;
    g[6][7]=4;
    g[7][8]=3;
    g[8][9]=10;
    g[9][10]=1;
    g[10][11]=3;
    g[11][12]=5;
    g[12][13]=6;
    g[13][14]=7;
    g[14][15]=8;
    for(int i=1;i<=14;i++)
        g[i+1][i]=g[i][i+1];
    //两点距离对称
    g[4][6]=4;
    g[6][4]=4;
    g[11][15]=5;
    g[15][11]=5;
    g[1][13]=7;
    g[13][1]=7;
    g[14][6]=15;
    g[6][14]=15;
    //补充路径


    floyd();
    //floyd算法求最短路

    int k;
    printf("查询地点名称请输入1,查询两地之间最短距离请输入2,为超市选址,实现总体最优请输入3。\n");
    scanf("%d",&k);
    if(k==1)
    {
        printf("请输入查询的地点标号");
        int num;
        scanf("%d",&num);
        printf("地点%d的名字叫作%s,该地点去超市的频率为%d\n",num,places[num].data,places[num].f);
        printf("简介:%s\n",places[num].imfomation);
    }
    else if(k==2)
    {
        int start,end;
        printf("请输入出发的地点标号");
        scanf("%d",&start);
        printf("请输入结束的地点标号");
        scanf("%d",&end);
        printf("%s到%s的最短路径为%d米\n",places[start].data,places[end].data,g[start][end]);
    }
    else if(k==3)
    {
        get_shop_place();
    }
    else
    {
        printf("输入有误!!!");
    }
    getchar();
    getchar();
    return 0;
}
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 20
int n;
int g[N][N];//路径矩阵
typedef struct{
    int frequency;//去超市的频率
    int num;//标号
    char name[20];//地点名称
    char imfomation[100];//简介
}place;
void floyd()
{
    for(int k = 1; k <= n; k ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
            {
                int t = g[i][k] + g[k][j];
                if(t < g[i][j])
                    g[i][j] = t;
            }
}
place places[20];
int min(int k,int g)
{
    return k<g? k:g;
}
void get_place()
{
    printf("请输入查询的地点标号");
    int num;
    scanf("%d",&num);
    printf("地点%d的名字叫作%s,该地点去超市的频率为%d\n",num,places[num].name,places[num].frequency);
    printf("简介:%s\n",places[num].imfomation);
}

void get_long()
{
    int start,end;
    printf("请输入出发的地点标号");
    scanf("%d",&start);
    printf("请输入结束的地点标号");
    scanf("%d",&end);
    printf("%s到%s的最短路径为%d米\n",places[start].name,places[end].name,g[start][end]);
}
void get_shop_place()
{
    int Min=0x3f3f3f3f,Min_place=1;
    for(int k = 1; k <= n; k ++)
    {
        int cnt=0;
        for(int i = 1; i <= n; i ++)
        {
            if(k!=i)
            {
                cnt+=(g[i][k]*places[i].frequency);
            }
        }
        printf("地点%d的名字叫作%s,该地点作为超市的距离的远近与频率为加权值为%d\n",k,places[k].name,cnt);
        if(cnt<Min)
            Min_place=k;
        Min=min(Min,cnt);
    }
    printf("所以,最合适的超市位置为地点%d%s\n",Min_place,places[Min_place].name);

}
void create_places()
{
    printf("请输入地点个数:\n");
    scanf("%d",&n);
    getchar();
    for(int i=1;i<=n;i++)
    {
        printf("请输入第%d个地点的名称:\n",i);
        char *name[20];
        char *fomation[100];
        scanf("%s",name);
        strcpy(places[i].name,name);
        // places[i].name=name;
        printf("请输入第%d个地点的简介:\n",i);
        scanf("%s",fomation);

        //places[i].imfomation=fomation;
        strcpy(places[i].imfomation,fomation);
        printf("请输入第%d个地点人们去超市的的频率:\n",i);
        scanf("%d",&places[i].frequency);
        places[i].num=i;
    }
}
void vista_palces()
{
    for(int i=1;i<=n;i++)
    {
        printf("%d号地点为%s\n该地点去超市的频率为%d %,\n 简介: %s\n",i,places[i].name,places[i].frequency,places[i].imfomation);
    }
}
void add()
{
    int m;
    printf("请输入路径个数:");
    scanf("%d",&m);

    while (m--) {
        int a, b, c;
        //a,b之间的距离为c
        printf("请输入出发的地点标号");
        scanf("%d", &a);

        printf("请输入结束的地点标号");
        scanf("%d", &b);

        printf("请输入两点之间的距离");
        scanf("%d", &c);

        g[a][b] = c;
        g[b][a] = c;
    }
}
void choose()
{
    int k;
    printf("查询地点名称请输入1\n查询两地之间最短距离请输入2\n为超市选址,实现总体最优请输入3。\n");
    scanf("%d",&k);
    if(k==1)//
    {
        get_place();
    }
    else if(k==2)
        get_long();
    else if(k==3)
        get_shop_place();
    else
        printf("输入有误!!!");
}
int main()
{
    create_places();
    //创建地点
    vista_palces();
    //遍历地点
    add();
    //增加路径
    floyd();
    //floyd就最短路
    choose();
    //选择操作
    system("pause");
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值