首页 > 代码库 > 洛谷——灾后重建

洛谷——灾后重建

据说这题正解是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;
}
View Code

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

洛谷——灾后重建