zoukankan      html  css  js  c++  java
  • 图论最短路径例题

    一本通网站上不去,截图为证

    还是要整博客的。。。

    目前学了FloydO(n3)和dijkstra算法O(n2

    Floyd是把每个点都遍历一遍,而后者只针对单个起点所以前者慢,但前者可以处理负边权(边的长度)。

    下面是一道例题(数据较小用了Floyd):

    中山路上有n(n<=100)家店,每家店的坐标均在-10000~10000之间。其中的m家店之间有通路。若有通路,则表示可以从一家店走到另一家店,通路的距离为两点间的直线距离。现在要找出从一家店到另一家店之间的最短距离。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a[105][3];
    double f[105][105];
    int n,i,j,k,x,y,m,s,e;
    int main(){
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d%d",&a[i][1],&a[i][2]);
        scanf("%d",&m);
        memset(f,0x7f,sizeof(f));  //附一个超大的值,方便下面考虑最短路径
        for(i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            f[x][y]=(sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2)));  //计算边权,也可以写成函数
            f[y][x]=f[x][y];
        }
        scanf("%d%d",&s,&e);
        for(k=1;k<=n;k++){
            for(i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if((i!=j)&&(j!=k)&&(i!=k)&&(f[i][k]+f[k][j]<f[i][j]))   //Floyd主要部分,遍历每个结点之间的最短路径,将k视为中间节点
                    f[i][j]=f[i][k]+f[k][j];
                }
            }
        }
        printf("%0.2lf",f[s][e]);
        return 0;
    }

    整个就是模板题,主要用来熟练思路

  • 相关阅读:
    [转]java 常用弹出框
    [转]ImageIcon icon 相对路径设置
    [转]『基本ASCII表和c语言运算表查询』
    [转]sqlmap技术手册
    [转]linux下怎么查看ssh的用户登录日志
    [转]Kali-linux安装之后的简单设置
    查看任意程序所连接的ip地址
    JS 闭包
    JS 中的 继承
    JS 原型的 理解
  • 原文地址:https://www.cnblogs.com/648-233/p/10744072.html
Copyright © 2011-2022 走看看