zoukankan      html  css  js  c++  java
  • Moving On (Floyd)

    题目

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

    题意

      给出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:
    ", ++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
    ", edge[k][u][v]);
            }
        }
        return 0;
    }
  • 相关阅读:
    员工转正考核
    前端高级技术考察
    前端基础技术考察
    高级前端评定表
    初级前端评定表
    前端工程师等级评定
    前端软实力
    Decode Ways
    深度学习在目标跟踪中的应用
    Interleaving String
  • 原文地址:https://www.cnblogs.com/Ruby-Z/p/11440270.html
Copyright © 2011-2022 走看看