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

  • 相关阅读:
    python D32 管道、线程池
    python D31 守护进程、进程锁、队列
    python D30 进程
    python 30 进程之间的相互独立、进程之间的时间差
    python D30 操作系统历史
    python D29 socketserver以及FTB
    python D28 粘包
    net4.0 task 超时任务代码 用Thread.sleep方式实现
    sql取随机结果集
    【ecshop---新增包邮卡功能】
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5383251.html
Copyright © 2011-2022 走看看