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

猜你喜欢

转载自www.cnblogs.com/Stay-Online/p/11440270.html