zoukankan      html  css  js  c++  java
  • TTTTTTTTTTTTTTTTT CF #182 div1 B floyd

    题意:

    有 n(3≤n≤100) 个站点,当第一次到达站点 u 的时候会增加寿命 au(1≤au≤103),题目给了 n 个站点的二位空间坐标,每两个站点之间的距离为曼哈顿距离(dis(i, j)=|xi-xj|+|yi-yj|),从站点 i 到达站点 j 需要的时间为 dis(i, j)*d(d 是题目给定的一个常数,且 103≤d≤105)。某个人最开始的时候在站点 1,他想到站点 n 去,问,他最开始至少剩下多少寿命才能活着到达站点 n?

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int inf = 0x3f3f3f3f;
    const double pi=acos(-1);
    const int mod=100000000;
    ll max(ll a,ll b)
    {return a>b?a:b;};
    ll min(ll a,ll b)
    {return a<b?a:b;};
    
    int a[105],x[105],y[105],n,d;
    ll mp[105][105],vis[205];
    
    int discost(int i,int j)
    {
        return d*(abs(x[i]-x[j])+abs(y[i]-y[j]));
    }
    
    int main()
    {
        while(~scanf("%d %d",&n,&d))
        {
           for(int i=2;i<=n-1;i++) scanf("%d",&a[i]);
           for(int i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]);
    
           for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
               {
                   if(i==j) continue;//这个处理很重要,不然mp[i][i]可能出现
    //赋值,floyd是不能处理负圈的,因为负圈没有最短路 mp[i][j]=discost(i,j)-a[i];//权值代表从i到j需要额外增加//的费用 } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); printf("%lld ",mp[1][n]); } return 0; }

     分析:n才200,显然暗示了n^3的算法,当然floyd

  • 相关阅读:
    git命令的使用
    动态生成表格的每一行的操作按钮如何获取当前行的index
    js判断一些时间范围是否有重复时间段
    infiniband install driver
    python之pip install
    KVM :vnc 远程控制kvm创建虚拟机
    如何设置UNIX/Linux中新创建目录或文件的默认权限
    python获取报文参考代码
    JAVA命名规范
    oracle常用知识随笔
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5383251.html
Copyright © 2011-2022 走看看