uva 10803 Thunder Mountain (floyd)

uva 10803 Thunder Mountain

题目大意:给出n个点的坐标,要求n个点每两点之间的最大距离。若这n个点,有不连通的地方,则输出Send Kurdy。

解题思路:Floyd。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 105;
const int INF = 0x3f3f3f3f;
int n;
double G[N][N];
double X[N], Y[N];
double dis(int x, int y) {
    return ((X[x] - X[y]) * (X[x] - X[y]) + (Y[x] - Y[y]) * (Y[x] - Y[y]));
}
void floyd() {
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (G[i][j] > G[i][k] + G[k][j]) {
                    G[i][j] = G[i][k] + G[k][j];
                }
            }
        }
    }
}
int main() {
    int T, Case = 1;
    scanf("%d", &T);
    while (T--) {
        printf("Case #%d:\n", Case++);
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                G[i][j] = INF;
            }
        }
        scanf("%d", &n);
        int a, b;
        for (int i = 0; i < n; i++) {
            scanf("%lf %lf", &X[i], &Y[i]);
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j) {
                    G[i][j] = INF;
                    continue;
                }
                G[i][j] = sqrt(dis(i, j));
                if (G[i][j] > 10.0) G[i][j] = INF;
            }
        }
        floyd();
        double ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (G[i][j] > ans) ans = G[i][j];
            }
        }
        if (INF - ans < 1e-9) printf("Send Kurdy\n");
        else printf("%.4lf\n", ans);
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-15 03:02:49

uva 10803 Thunder Mountain (floyd)的相关文章

【UVA】821-Page Hopping(Floyd)

模板题,求一个点到任何一点的距离,用Floyd就行了,结点不一定是从1 ~ n 的,所以需要记录结点的id 14063895 821 Page Hopping Accepted C++ 0.119 2014-08-19 10:00:27 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<sta

UVa 10803 - Thunder Mountain

題目:給你平面上的n個點(笛卡爾坐標),每個點之間都有連線,如果距離超過10就認為斷開: 請你給出所有點間最短距離的最大值. 分析:最短路.多源最短路使用floyd算法. 首先建圖,然後將大於10的邊都定義成oo,求解最短路,輸出最短路中的最大值即可. 說明:距離700題還有40題╮(╯▽╰)╭. #include <cstring> #include <cstdio> #include <cmath> const double oo = 50000; typedef

UVa 821 - Page Hopping(Floyd)

给出能相互到达的网页,输出在给出的网页中相互到达需要点击几次,首先离散化,然后用Floyd求少点击次数,枚举求平均点击次数. #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; const int maxn=110; const int inf=0x3f3f3f3f; int d[maxn][maxn]; map<int,in

uva 247 Calling Circles(Floyd 的简单应用)

最近在看图论的经典算法, 先看的是求单源最短路的dijkstra,优化后的算法用了优先队列,看起来有点复杂. 感觉 弗洛伊德(Floyd) 要比 迪克斯特拉(dijkstra) 更好理解一点,但是Floyd是三层循环,当然会慢很多.一旦数据开大就跪了吧. floyd可以用来求 两个 连通点间的最短路问题.同时可以得到边权的和,即最短路的长度. 另外一个比较简单的应用,还可以用来判断两点间的连通性.即判断两点是否连通.本题就是弗洛伊德的这种简单用法. #include<cstdio> #incl

UVA 618 - Doing Windows(数论)

题目链接:618 - Doing Windows 题意:给定一个大小不能变的屏幕,和四个大小可以变的窗口,变化要保持长宽比,问这四个窗口能不能调整后全部放下正好填满屏幕,不能重叠 思路:情况一共就几种:4个叠一起,3个叠一起+一个,2个和2个,一个和两个叠一起在一个,把这几种情况全判断了就可以了,判断过程利用gcd,lcm可以求边长. 代码: #include <stdio.h> #include <string.h> long long gcd(long long a, long

Uva 10404-Bachet&#39;s Game(博弈)

题目链接:点击打开链接 在DP专题里刷到的,看着像博弈就水过去了.. 题意:n件物品,两个人轮流取,每次取的数量必须为一个集合s(集合里肯定含有1)里的一个数字,最后不能取者输(即取走最后一件物品者胜). 思路:递推.设 w[i] 为有i件物品时的状态,w[i]=1代表先手必胜,w[i]=0代表先手必败.可以知道w[1]=1,递推生成所有状态. 可以知道对于一个状态,如果他的后继存在必败状态,则该状态为必胜状态:如果该状态的所有后继都为必胜状态,那么该状态为必败状态. #include <alg

UVA 417 - Word Index(数论)

题意:417 - Word Index 题意:每个字符串按题目中那样去映射成一个数字,输入字符串,输出数字 思路:这题还是比较水的,由于一共只有83000多个数字,所以对应一个个数字去映射就可以了,注意字符串进位的情况处理即可 代码: #include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; char str[10]; map<

UVA 1372 - Log Jumping(推理)

题目链接:1372 - Log Jumping 题意:给定一些n个木板的起始位置和长度k,相重叠的木板可以互相跳跃,求能构成环的最大数量. 思路:先按起始位置排序,然后每次多一个木板就去判断他和前一个和前前一个能不能互相跳跃,如果可以的话就可以多加上这个木板. 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define max(a,b) ((a)

UVA 11314 - Hardly Hard(数论)

题目链接:11314 - Hardly Hard 题意:给定A,B两点,求Y轴上一点C和X轴上一点D,使得该四边形周长最小. 思路:B以Y轴做对称点,A以X轴做对称点,然后两点相连就是其他三边的周长,因为两点间线段最短,然后再加上AB长度即可 代码: #include <stdio.h> #include <string.h> #include <math.h> int t; struct Point { double x, y; Point() {} Point(do