• XidianOJ 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,对于每个修好的站点,按他是起点,终点,中继点来分别更新

    #include <cstdio>
    #include <cctype>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    
    LL n,m,t;
    
    LL d[301][301];
    LL repaired[301] = {0};
    int main(){
      //freopen("test.in","r",stdin);
      while (scanf("%lld %lld %lld",&n,&m,&t) != EOF){
        memset(d,-1,sizeof(d));
        for (int i=0;i<n;i++) d[i][i] = 0;
        for (int i=1;i<=m;i++){
          LL u,v,w;
          scanf("%lld %lld %lld",&u,&v,&w);
          if (u == v) continue;
          if (d[u][v] == -1) d[u][v] = w;
          else d[u][v] = min(d[u][v],w);
        }
        memset(repaired,0,sizeof(repaired));
        int times;
        for (times=1;times<=t;times++){
          int order;
          scanf("%d",&order);
          if (order == 0){
            int x;
            scanf("%d",&x);
            if (repaired[x] == 1){
              printf("lab %d has been repaired!
    ",x);
              continue;
            }
            repaired[x] = 1;
            LL i,j;
            for (i=0;i<n;i++){
              if (!repaired[i]) continue;
              for (j=0;j<n;j++){
                if (!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 (i=0;i<n;i++){
                if (!repaired[i]) continue;
                for (j=0;j<n;j++){
                  if (!repaired[j]) continue;
                if (d[x][i] != -1 && d[i][j] != -1){
                  if (d[x][j] == -1) d[x][j] = d[i][j] + d[x][i];
                  else d[x][j] = min(d[x][j],d[i][j]+d[x][i]);
                }
              }
            }
            for (i=0;i<n;i++){
                if (!repaired[i]) continue;
                for (j=0;j<n;j++){
                  if (!repaired[j]) continue;
                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 {
            LL u,v;
            scanf("%lld %lld",&u,&v);
            if (!repaired[u] || !repaired[v]){
              printf("help %lld %lld
    ",u,v);
            }
            else if (d[u][v] == -1){
              printf("no path
    ");
            }
            else {
              printf("%lld
    ",d[u][v]);
            }
          }
        }
      }
      return 0;
    }
    View Code
  • 相关阅读:
    继承String?
    java sizeof
    什么是java序列化,如何实现java序列化?
    负载均衡的时候如何实现相同的session被分配到同一个服务器
    如何实现session共享
    java 字符串排序
    forward和redirect的区别
    数字签名 数字证书
    找出数组中重复次数最多的元素并打印
    get和post区别
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/6735896.html
Copyright © 2020-2023  润新知