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