洛谷灾后重建

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int MAXN = 210;
const int INF = 1e8;
int dis[MAXN][MAXN],t[MAXN];
int n,m,k;

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=0; i<n; ++i)    //坐标都是从0开始
        for (int j=0; j<n; ++j)
            dis[i][j] = INF;
    for (int i=0; i<n; ++i)
        scanf("%d",&t[i]);    //这个是有序的
    for (int u,v,w,i=1; i<=m; ++i)
    {
        scanf("%d%d%d",&u,&v,&w);
        dis[u][v] = w;
        dis[v][u] = w;
    }
    t[n] = INF;    //当k到达n时,可以跳出循环
    int q,k = 0,u,v,w;
    scanf("%d",&q);
    while (q--)
    {
        scanf("%d%d%d",&u,&v,&w);
        while (t[k]<=w)    //是t[k]不是k,k表示当前是第几个点修建完成
        {
            for (int i=0; i<n; ++i)    //Floyd
                for (int j=0; j<n; ++j)
                    if (dis[i][k]!=INF&&dis[k][j]!=INF)
                        dis[i][j] = min(dis[i][k]+dis[k][j],dis[i][j]);
            k++;
        }
        if (t[u]>w||t[v]>w||dis[u][v]==INF) printf("-1\n");//判断u,v点在w时间是否修建完成,完成是否能到达
        else printf("%d\n",dis[u][v]);
    }
    return 0;
}
时间: 2024-11-05 23:09:54

洛谷灾后重建的相关文章

洛谷——灾后重建

据说这题正解是floyd???!!! 不管他,虽然我的dij  TLE了 就当作是练一练dij 只有50分 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> using namespace std; inline int read(){ int num=0,t=1;char

洛谷P1119 灾后重建(floyd)

P1119 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的.并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车.若t[i]为0则说明地震未对此地区造成损坏,一

AC日记——灾后重建 洛谷 P1119

灾后重建 思路: 看到n<=200,思考弗洛伊德算法: 如何floyed呢? floyed是一种动态规划求最短路的算法: 它通过枚举中间点来更新两点之间最短路: 回到这个题本身: 所有点的重建完成的时间和询问的时间都已经排好序了: 所以,我们把floyed拆开: 对于一个三维的k,i,j的floyed算法: 我们判断当前的询问在哪两个相邻的k之间: 然后,我们判断当时的连通性以及最短路情况: 来,上代码: #include <cstdio> #include <cstring>

CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

描述 灾后重建(rebuild)  B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄.  给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的.并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车.若t[i]为0则说明地震未对此地区造成损坏,一开始

P1119 灾后重建

P1119 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的.并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车.若t[i]为0则说明地震未对此地区造成损坏,一

[Luogu P1119] 灾后重建 (floyd)

题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一遍单元最短路 因为最多只有200个时刻,时间复杂度为O(n^3log(n+m))) (堆优化的迪杰斯特拉) 显然对于n=200,并过不了 我们可有进一步分析 这一题,我们堆优化的迪杰斯特拉慢在每加入一个点,我们每一次都得对全图彻彻底底做一轮松弛 那换个角度考虑,如果我只松弛经过新加入的点的点对呢?

灾后重建「解题报告」

P1119 灾后重建 Luogu P1119 题意 有n个村庄m条路,每个村庄都被地震摧毁,在某一时刻 \(t_i\)被修好.对于某条路,只有当它连接的两个村庄都被修好后才能通过.有q个询问,询问在某一时刻两村庄间的最短路. 第一行包含两个正整数 \(n,m\) . 第二行包含 \(n\) 个非负整数 \(t_0, t_1,-, t_{N-1}\),表示每个村庄重建完成的时间,数据保证了 \(t_0 ≤ t_1 ≤ - ≤ t_{N-1}\) 接下来 \(m\) 行,每行3个非负整数 \(i,j

【题解】灾后重建——(floyd)

这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向

灾后重建(对Floyd的认识)

传送门 主要考察了对Floyd算法的认识程度(告诉我们背板子是不行的). Floyd,代码很简单,而其本质思想是通过其他的点进行中转来求的两点之间的最短路.因为我们知道,两点之间有多条路,如果换一条路可以缩短距离的话,就更新最短距离.而它最本质的思想,就是用其他的点进行中转,从而达到求出最短路的目的.(精辟总结摘自洛谷题解). 对于这道题,要求得任意两点间的最短路,但是可以用来做中转点的点确实不定的. 我们可以对于每次因时间增加而加入的新的可以做中转点的点,运用Floyd的本质解题. 题目保证t