| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3401 人关注过本帖
标题:已知10个城市坐标求从任意一个指定城市出发遍历的最短路径(最后回到起点) ...
只看楼主 加入收藏
奈奈生
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-6-28
收藏
 问题点数:0 回复次数:2 
已知10个城市坐标求从任意一个指定城市出发遍历的最短路径(最后回到起点)。
虽然知道用Dijkstra或者Floyd可是不会写代码。求救
搜索更多相关主题的帖子: 城市 指定 遍历 最短路径 起点 
2018-06-28 14:52
a201187902
Rank: 2
等 级:论坛游民
帖 子:5
专家分:20
注 册:2018-5-1
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define maxint 32767
typedef struct
{
    char vex[100];
    int a[100][100];
}map;
typedef enum{FALSE,TRUE} boolean;
int d1[100], p1[100];
int d[100][100], p[100][100];
void dijk(map &g, int v1, int n)   //迪杰斯特算法
{
    int d[100], p[100];
    boolean s[100];
    int v, i, w, min;
    for (v = 1; v <= n; v++)    //初始化
    {
        s[v] = FALSE;
        d[v] = g.a[v1][v];
        if (d[v] < maxint)
            p[v] = v1;     //v1是v的前趋
        else
            p[v] = 0;      //v无前趋
    }
    d[v1] = 0; 
    s[v1] = TRUE;
    for (i = 2; i < n; i++)    //n-1个顶点
    {
        min = maxint;
        for (w = 1; w <= n; w++)
            if (!s[w] && d[w] < min)
            {
                v = w;
                min = d[w];
            }
        s[v] = TRUE;
        for (w = 1; w <= n; w++)
            if (!s[w] && (d[v] + g.a[v][w] < d[w]))
            {
                d[w] = d[v] + g.a[v][w];
                p[w] = v;
            }
    }
    printf("路径长度     路径\n");
    for (i = 1; i <= n; i++)
    {
        printf("%5d", d[i]);
        printf("%5d", i);
        v = p[i];
        while (v != 0)
        { 
            printf("<--%d", v);
            v = p[v];
        }
        printf("\n");
    }
}
void floyd(map g, int n)
{
    for (int i = 1; i <= n; i++)         //设置路径长度d初值
        for (int j = 1; j <= n; j++)
        {
            if (g.a[i][j] != maxint)
                p[i][j] = j;
            else
                p[i][j] = 0;
            d[i][j] = g.a[i][j];
        }
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
            {
                if (d[i][k] + d[k][j] < d[i][j])
                {
                    d[i][j] = d[i][k] + d[k][j];  //修改长度
                    p[i][j] = p[i][k];
                }
            }
    }
}
void createmap(map &g, int n, int e)
{
    int i, j, k, w;
    for (i = 1; i <= n; i++)
        g.vex[i] = (char)i;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            g.a[i][j] = maxint;
    printf("输入%d条边的i、j、w:\n",e);
    for (k = 1; k <= e; k++)
    {
        scanf_s("%d%d%d", &i,&j,&w);
        g.a[i][j] = w;
    }
    printf("建立完毕\n");
}
void main()
{
    map g;
    int n, e, v, w, k;
    int flag = 1;
    printf("输入图中顶点个数和边数n,e:");
    scanf_s("%d%d", &n, &e);
    createmap(g, n, e);
    while (flag!=0)
    {
        printf("**********求城市最短路径**********\n");
        printf("1、求一个城市到所有城市的最短路径\n");
        printf("2、求任意的两个城市之间的最短路径\n");
        printf("0、退出\n");
        scanf_s("%d", &flag);
        if (flag == 1)
        {
            printf("求单源路径,输入源点v:");
            scanf_s("%d", &v);
            dijk(g, v, n);    //调用迪杰斯特算法
            printf("\n\n");
        }
        else if (flag == 2)
        {
            floyd(g, n);     //调用弗洛伊德算法
            printf("输入源点v和终点w:");
            scanf_s("%d%d", &v, &w);
            k = p[v][w];       //k为起点v的后继算法
            if (k == 0)
                printf("顶点%d到%d无路径!\n", v, w);
            else
            {
                printf("顶点%d到%d的最短路径是:  %d", v, w, v);
                while (k != w)
                {
                    printf("-->%d", k);  //输出后继顶点
                    k = p[k][w];
                }
                printf("-->%d", w);  //终点
                printf("\n路径长度:%d\n", d[v][w]);
                printf("\n\n");
            }
        }
        else
            printf("已选择退出\n");
    }
}

 
2018-07-08 13:00
newworld2
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-8-15
收藏
得分:0 
似乎是个npc问题?
2018-08-15 23:15
快速回复:已知10个城市坐标求从任意一个指定城市出发遍历的最短路径(最后回到起 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019672 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved