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

原文地址:https://www.cnblogs.com/smilesundream/p/5383251.html