Take Your Seat (Floyd)

Posted stay-online

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Take Your Seat (Floyd)相关的知识,希望对你有一定的参考价值。

题目

  https://nanti.jisuanke.com/t/41288

题意

  给出n个城市的危险程度以及一个邻接矩阵描述道路信息。之后m个询问,问 ( u, v ) 城市之间不经过大于w危险程度的城市的情况下的最短路。

题解

  裸的Floyd,不降维的那种。edge【k】【i】【j】表示用前k个城市更新。那么首先将城市根据危险程度从小到大排个序,那么经过这种顺序更新的edge数组,前k个城市更新出的图一定不会包括超出第k个城市危险程度的城市。最后询问for一边找能在1~w范围内最大的k城市就好了。

  其实这道题是一个裸的Floyd,但说实话对Floyd的理解实在不够深刻,只停留在板子。。。。

 #include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#define ull unsigned long long
#define met(a, b) memset(a, b, sizeof(a))
#define lowbit(x) (x&(-x))
#define MID (l + r) / 2
#define ll long long

using namespace std;

const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e6 + 3;
const int maxn = 1e5 + 7;
const int N = 110;

struct node 
    int data, id;
    bool operator < (const node &a) const 
        return data < a.data;
    
arr[220];

int edge[220][220][220];

int main() 
    int T, sp = 0;
    scanf("%d", &T);
    while(T--) 
        int n, m;
        scanf("%d%d", &n, &m);
        arr[0].data = 0;
        for(int i = 1; i <= n; i++) 
            scanf("%d", &arr[i].data);
            arr[i].id = i;
        
        sort(arr+1, arr+1+n);
        for(int i = 1; i <= n; i++) 
            for(int j = 1; j <= n; j++) 
                scanf("%d", &edge[0][i][j]);
            
        
        for(int k = 1; k <= n; k++) 
            int t = arr[k].id;
            for(int i = 1; i <= n; i++) 
                for(int j = 1; j <= n; j++) 
                    edge[k][i][j] = min(edge[k-1][i][j], edge[k-1][i][t] + edge[k-1][t][j]);
                
            
        
        printf("Case #%d:\n", ++sp);
        for(int i = 1; i <= m; i++) 
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            int k = 0;
            for(int i = 1; i <= n; i++) 
                if(arr[i].data <= w) k = i;
            printf("%d\n", edge[k][u][v]);
        
    
    return 0;

 

https://nanti.jisuanke.com/t/41288

以上是关于Take Your Seat (Floyd)的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019 ACM-ICPC, China Multi-Provincial Collegiate D. Take Your Seat(数学概率)

Take your kids to an imaginative sandbox theatre show

take your juice out of the shop是啥意思

take your juice out of the shop 翻译中文

B. Take Your Places!(思维)

B. Take Your Places!(思维)