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。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::min;
    const int MAXV=210,Q=50010;
    int n,m,q,dis[MAXV][MAXV],t[MAXV],qu[Q],qv[Q],qt[Q];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%d",&t[i]);
        memset(dis,0x3f,sizeof(dis));
        for(int i=1;i<=m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            dis[u][v]=dis[v][u]=w;
        }
        scanf("%d",&q);
        for(int i=1;i<=q;i++) scanf("%d%d%d",&qu[i],&qv[i],&qt[i]);
        int now=1;
        t[n]=t[n-1]+1;
        for(int k=0;k<n;k++){
            while(now<=q&&qt[now]<t[k]){
                int qans=dis[qu[now]][qv[now]];
                if(t[qu[now]]>=t[k]||t[qv[now]]>=t[k]) qans=-1;
                printf("%d
    ",qans==dis[n][n]?-1:qans);
                now++;
            }
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
        }
        while(now<=q){
                int qans=dis[qu[now]][qv[now]];
                printf("%d
    ",qans==dis[n][n]?-1:qans);
                now++;
            }
    }
  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5929621.html
Copyright © 2011-2022 走看看