zoukankan      html  css  js  c++  java
  • uva 1001(最短路)

    题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置,在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间

    题解:如果两个洞相交,那么d[i][j]=0;如果不相交,那么d[i][j]=dist-(r[i]+r[j]),dist为这两个洞圆心之间的欧几里得距离

    再用Dijkstra处理就可以了

    #include <cstdio>
    #include <iostream>
    #include <sstream>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include <queue>
    #include <stack>
    #include <algorithm>
    using namespace std;
    #define ll long long
    #define _cle(m, a) memset(m, a, sizeof(m))
    #define repu(i, a, b) for(int i = a; i < b; i++)
    #define repd(i, a, b) for(int i = b; i >= a; i--)
    #define sfi(n) scanf("%d", &n)
    #define sfd(n) scanf("%lf", &n)
    #define pfi(n) printf("%d
    ", n)
    #define pfd(n) printf("%lf
    ", n)
    #define sfi2(n, m) scanf("%d%d", &n, &m)
    #define sfd2(n, m) scanf("%lf%lf", &n, &m)
    #define pfi2(n, m) printf("%d %d
    ", n, m)
    #define pfi3(a, b, c) printf("%d %d %d
    ", a, b, c)
    #define maxn 105
    double dd[maxn][maxn];
    struct Cir{
       double x, y, z, r;
    }c[maxn];
    double get_d(Cir c1, Cir c2)
    {
        return sqrt((c1.x - c2.x) * (c1.x - c2.x) +
                    (c1.y - c2.y) * (c1.y - c2.y) +
                    (c1.z - c2.z) * (c1.z - c2.z));
    }
    
    const double inf = 1000000000000.0;
    struct Dijkstra {
        int n;    //图,须手动传入!
        double E[maxn][maxn], d[maxn];
        int p[maxn];    //最短路径,父亲
    
        void init(int n) {
            this->n = n;
            repu(i, 0, n) repu(j, 0, n)
            E[i][j] = dd[i][j];
        }
    
        void solve(int s) {
            static bool vis[maxn];
    
            memset(vis, 0, sizeof(vis));
            memset(p, 255, sizeof(p));
            repu(i, 0, n + 1) d[i] = inf;
            d[s] = 0.0;
            //repu(i, 0, n) pfd(d[i]);
            while(1) {
                int u = -1;
                for(int i = 0; i < n; i ++) {
                    if(!vis[i] && (u == -1||d[i] < d[u])) {
                        u = i;
                    }
                }
                if(u == -1 || d[u] == inf) break;
                vis[u] = true;
                for(int v = 0; v < n; v ++) {
                    if(d[u] + E[u][v] < d[v]) {
                        d[v] = d[u] + E[u][v];
                        p[v] = u;
                    }
                }
            }
        }
    } dij;
    
    
    int main()
    {
        int n;
        int kase = 0;
        while(~sfi(n) && n != -1)
        {
            kase++;
            repu(i, 1, n + 1)
            sfd2(c[i].x, c[i].y), sfd2(c[i].z, c[i].r);
    
            sfd2(c[0].x, c[0].y), sfd(c[0].z);
            sfd2(c[n + 1].x, c[n + 1].y), sfd(c[n + 1].z);
            c[0].r = c[n + 1].r = 0.0;
    
            repu(i, 0, n + 2)
            repu(j, 0, n + 2)
            {
               dd[i][j] = get_d(c[i], c[j]) - (c[i].r + c[j].r);
               if(dd[i][j] < 0.0) dd[i][j] = 0.0;
               //printf("%d %d %lf
    ", i, j, dd[i][j]);
            }
    
    
            dij.init(n + 2);
            dij.solve(0);
    
            //repu(i, 0, n + 2) pfd(dij.d[i]);
            printf("Cheese %d: Travel time = %d sec
    ",
                         kase, (int)round(dij.d[n + 1] * 10.0));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    狗蛋带仨妞【Beta】Scrum meeting 1
    实验九 团队作业5:团队项目编码与Alpha冲刺
    狗蛋带仨妞【Alpha】Scrum meeting 7
    狗蛋带仨妞【Alpha】Scrum meeting 6
    狗蛋带仨妞【Alpha】Scrum meeting 5
    狗蛋带仨妞 【Alpha】Scrum meeting 1-4
    Rosetta中准备配体的参数文件
    pymol安装
    chemshell的creation之后
    关于KIE的一点认识
  • 原文地址:https://www.cnblogs.com/sunus/p/4830508.html
Copyright © 2011-2022 走看看