洛谷——灾后重建

据说这题正解是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 c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=(num<<1)+(num<<3)+c-‘0‘;c=getchar();}
    return num*t;
}
const int mn=210,INF=1000000000;
struct edge{int t,c;};
vector<edge> g[mn];
typedef pair<int,int> P;
int d[mn],n,m,q,ok[mn],t[mn];
void add(int f,int t,int c){
    g[f].push_back((edge){t,c});
    g[t].push_back((edge){f,c});
}
void dij(int s){
    priority_queue< P,vector<P>,greater<P> > q;
    for(int i=0;i<=n;i++)d[i]=INF;
    d[s]=0;q.push(P(0,s));
    while(!q.empty()){
        P p=q.top();q.pop();
        int x=p.second;
        if(d[x]<p.first||!ok[x])continue;
        for(int i=0;i<g[x].size();i++){
            edge e=g[x][i];
            if(d[e.t]>d[x]+e.c&&ok[e.t]){
                d[e.t]=d[x]+e.c;
                q.push(P(d[e.t],e.t));
            }
        }
    }
}
int main()
{
    memset(ok,0,sizeof(ok));
    n=read();m=read();
    int x,y,z;
    for(int i=1;i<=n;i++)t[i]=read();
    for(int i=1;i<=m;i++){
        x=read()+1;y=read()+1;z=read();add(x,y,z);
    }
    q=read();int tmp=1;
    while(q--){
        x=read()+1;y=read()+1;z=read();
        while(t[tmp]<=z)ok[tmp++]=1;
        dij(x);printf("%d\n",d[y]==INF?-1:d[y]);
    }
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-11-03 21:50:21

洛谷——灾后重建的相关文章

洛谷灾后重建

#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)

洛谷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