zoukankan      html  css  js  c++  java
  • XDU1159 分步更新floyd

      附上题目链接http://acm.xidian.edu.cn/problem.php?id=1159  

    [提交][状态][讨论版]

    题目描述

    天国的地铁遭到了冥王哈乙丁的破坏,神圣军团的总司令爱神下令天国的地铁侠们携手542基地对冥王哈乙丁展开了激烈的斗争。天国中的 m 条地铁通道连接了 n 个实验室,如今所有的实验室已经被哈乙丁破坏。如果地铁要在两个实验室之间来往,那么地铁在它们之间经过的实验室必须是完好的。

    地铁侠(江湖人称瑾爷)具有维护实验室的和平和安宁的能力,可确保地铁顺利通车。

    542基地成员能判断两个实验室是否可以连通,不过现在由于哈乙丁的破坏,导致基地成员的判断能力大大减弱,所以请聪明的你来帮忙。如果你算对了,就有可能被邀请加入542基地组织。你只有 t 个单位时间,每个单位时间只能完成一次维护或判断。

    注意:天国的地铁通道是单方向的。

    输入

    多组数据,请处理到文件结束。

    每组数据,第一行包含 3 个整数 n, m, t ,用空格分割。

    之后 m 行,每行 3 个整数 u, v, w ,用空格分割,表示实验室 u 到 v 有一条地铁通道,长度为 w 。

    之后 t 行,每行表示一个任务:

    若为 0 x ,表示地铁侠用“ DJ 光环”维护好了编号为 x 的实验室。

    若为 1 u v ,表示你要判断 u 到 v 是否通车。

    保证 0<n<=300, 0<m<=100000, 0<t<100000, 0<=u, v<n, 0<w<=10000。

    输出

    对于输入 0 x ,若实验室已经被维护过,输出 "lab x has been repaired!"(不含引号,下同)。

    对于输入 1 u v ,若 u 和 v 中至少有一个没有被维护,输出 "help u v"。若无法在 u, v 之间通车,输出 "no path"。否则输出 u 到 v 的最短路的长度。

    分析:我们可以考虑用拆分的floyd来更新 0 x操作, 加入一个点后有三种可能, 这个点有可能是起点 终点 也可能是中转点, 因此我们将所有情况都做一遍floyd即可, 注意更新的顺序必须是 起点 终点 中转点  或者 终点 起点 中转点, 这样才可以更新完全, 代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    typedef long long LL;
    const int maxn = 350;
    int n, m, t;
    LL d[maxn][maxn];
    bool repaired[maxn];
    
    int main() {
        while(scanf("%d%d%d", &n, &m, &t) == 3){
            memset(d, -1, sizeof(d));
            for(int i=0; i<n; i++) d[i][i] = 0;
            for(int i=0; i<m; i++){
                int u, v, c;
                scanf("%d%d%d", &u, &v, &c);
                if(u == v) continue;
                if(d[u][v] == -1) d[u][v] = c;
                else d[u][v] = min(d[u][v], (LL)c);
            }
            memset(repaired, 0, sizeof(repaired));
            for(int i=0; i<t; i++){
                int op;
                scanf("%d", &op);
                if(op == 0){
                    int x;
                    scanf("%d", &x);
                    if(repaired[x]) printf("lab %d has been repaired!
    ", x);
                    else{
                        repaired[x] = 1;
                        for(int i=0; i<n; i++)
                        for(int j=0; j<n; j++){
                            //j -> i -> x
                            if(!repaired[i] || !repaired[j]) continue;
                            if(d[j][i]!=-1 && d[i][x]!=-1){
                                if(d[j][x]==-1) d[j][x] = d[j][i] + d[i][x];
                                else d[j][x] = min(d[j][x], d[j][i]+d[i][x]);
                            }
                        }
                        for(int i=0; i<n; i++)
                        for(int j=0; j<n; j++){
                            if(!repaired[i] || !repaired[j]) continue;
                            //x -> i -> j
                            if(d[x][i]!=-1 && d[i][j]!=-1){
                                if(d[x][j] == -1) d[x][j] = d[x][i] + d[i][j];
                                else d[x][j] = min(d[x][j], d[x][i]+d[i][j]);
                            }
                        }
                        for(int i=0; i<n; i++)
                        for(int j=0; j<n; j++){
                            if(!repaired[i] || !repaired[j]) continue;
                            //i -> x -> j
                            if(d[i][x]!=-1 && d[x][j]!=-1){
                                if(d[i][j] == -1) d[i][j] = d[i][x] + d[x][j];
                                else d[i][j] = min(d[i][j], d[i][x]+d[x][j]);
                            }
                        }
                    }
                }else{
                    int u, v;
                    scanf("%d%d", &u, &v);
                    if(!repaired[u] || !repaired[v])
                        printf("help %d %d
    ", u, v);
                    else if(d[u][v] == -1)
                        printf("no path
    ");
                    else
                        cout<<d[u][v]<<endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]: Specified class
    移动商城第三篇【搭建Mybatis和Spring环境、编写Dao、Service在Core模块】
    移动商城第二篇【页面框架解析】
    移动商城第一篇【搭建项目环境】
    idea下使用Maven找不到类
    Oracle与Mysql区别简述
    Shiro第六篇【验证码、记住我】
    Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】
    Shiro第四篇【Shiro与Spring整合、快速入门、Shiro过滤器、登陆认证】
    Shiro第三篇【授权、自定义reaml授权】
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5442621.html
Copyright © 2011-2022 走看看