zoukankan      html  css  js  c++  java
  • P1119 灾后重建

    题目背景

    B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。

    题目描述

    给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的。并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车。若t[i]为0则说明地震未对此地区造成损坏,一开始就可以通车。之后有Q个询问(x, y, t),对于每个询问你要回答在第t天,从村庄x到村庄y的最短路径长度为多少。如果无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未重建完成 ,则需要返回-1。

    输入输出格式

    输入格式:

    输入文件rebuild.in的第一行包含两个正整数N,M,表示了村庄的数目与公路的数量。

    第二行包含N个非负整数t[0], t[1], …, t[N – 1],表示了每个村庄重建完成的时间,数据保证了t[0] ≤ t[1] ≤ … ≤ t[N – 1]。

    接下来M行,每行3个非负整数i, j, w,w为不超过10000的正整数,表示了有一条连接村庄i与村庄j的道路,长度为w,保证i≠j,且对于任意一对村庄只会存在一条道路。

    接下来一行也就是M+3行包含一个正整数Q,表示Q个询问。

    接下来Q行,每行3个非负整数x, y, t,询问在第t天,从村庄x到村庄y的最短路径长度为多少,数据保证了t是不下降的。

    输出格式:

    输出文件rebuild.out包含Q行,对每一个询问(x, y, t)输出对应的答案,即在第t天,从村庄x到村庄y的最短路径长度为多少。如果在第t天无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未修复完成,则输出-1。

    输入输出样例

    输入样例#1:
    4 5
    1 2 3 4
    0 2 1
    2 3 1
    3 1 2
    2 1 4
    0 3 5
    4
    2 0 2
    0 1 2
    0 1 3
    0 1 4
    输出样例#1:
    -1
    -1
    5
    4

    说明

    对于30%的数据,有N≤50;

    对于30%的数据,有t[i] = 0,其中有20%的数据有t[i] = 0且N>50;

    对于50%的数据,有Q≤100;

    对于100%的数据,有N≤200,M≤N*(N-1)/2,Q≤50000,所有输入数据涉及整数均不超过100000。

    【解析】

    方法:floyed

    floyed最外层的k是枚举的中间点,那么我们每次枚举已经修建好的中间点来更新路径。

    注意时间和询问的时间都是排序了的。。。。

    【代码】

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define N 210
    #define inf 0x7fff
    using namespace std;
    int n,m,q;
    int t[N];
    int map[N][N];
    int main()
    {
        cin>>n>>m;
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        map[i][j]=inf*(i!=j);
        for (int i = 0; i < n; ++i)
            scanf("%d",&t[i]);
        t[n]=inf;
        for (int i = 0; i < m; ++i)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            map[x][y]=z;
            map[y][x]=z;
        }
       scanf("%d",&q);
        int u=0;
        for (int i = 0; i < q; ++i)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            while(t[u]<=z)
            {
                for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)
                        map[i][j]=min(map[i][j],map[i][u]+map[u][j]);
                u++;
            }
            if(t[x]>z||t[y]>z||map[x][y]==inf)
                puts("-1");
            else
                printf("%d
    ",map[x][y]);
        }
        return 0;
    }
  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/zzyh/p/6832544.html
Copyright © 2011-2022 走看看