编程语言
首页 > 编程语言> > C++9018:1144——最短路径问题

C++9018:1144——最短路径问题

作者:互联网

题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1144

题目描述

平面上有 n 个点(n<=100),每个点的坐标均在-10000~10000 之间。其中的一些点之间有连线 。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离 。现在的任务是找出从一点到另一点之间的最短路径 。

输入

 输入共 n+m+3 行,其中:
    第一行为整数 n。
    第 2 行到第 n+1 行    (共 n 行 ),每行两个整数 x 和 y,描述了一个点的坐标。
    第 n+2 行为一个整数 m,表示图中连线 的个数。
    此后的 m 行(m<=1000),每行描述一条连线,由两个整数 i和 j 组成,表示第 i个点和第 j 个点之
间有连线 。
    最后一行 :两个整数 s 和 t,分别表示源点和目标点。

输出

输出仅一行,一个实数(保留两位小数),表示从 s 到 t 的最短路径长度 。

样例输入

5 
0 0 
2 0 
2 2 
0 2 
3 1 
5 
1 2 
1 3 
1 4 
2 5 
3 5 
1 5

样例输出

3.41

作者分析:Floyed最短路算法,后面我会写一篇关于最短路的文章。
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;

int a[101][3];                            // 点的位置
double dis[1001][1001];                    // 各点之间的最短路
int n,m,s,t,x,y;

double suan(int x,int y,int xx,int yy){
    return sqrt(pow(double(x - y),2) + pow(double(xx - yy),2));// 计算路径长度 
}
void init(){
    memset(dis,0x7f,sizeof(dis));
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i][1] >> a[i][2];
    cin >> m;
    for (int i = 1;i <= m;i++){
        cin >> x >> y;
        dis[x][y] = dis[y][x] = suan(a[x][1],a[y][1],a[x][2],a[y][2]);
    }
    cin >> s >> t;
}
double floyed(int s,int t){                // Floyed最短路算法 
    for (int i = 1;i <= n;i++){
        for (int j = 1;j <= n;j++){
            for (int k = 1;k <= n;k++){
                if (i != j && j != k && i != k && dis[j][i] + dis[i][k] < dis[j][k]){
                    dis[j][k] = dis[j][i] + dis[i][k];// 最短路 
                }
            }
        }
    }
    return dis[s][t];                    // 返回值 
}
int main(){
    init();                                // 初始化 
    printf("%.2f",floyed(s,t));            // 输出 
    return 0;
} 

 

 

标签:1144,int,double,短路,cin,C++,include,9018,dis
来源: https://www.cnblogs.com/linyiweiblog/p/14507235.html