堆优化dij T了4个点
查看原帖
堆优化dij T了4个点
469375
Imtking楼主2021/9/22 19:51
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=300;
int to[N*N],val[N*N],nxt[N*N];
int head[N],dis[N];
bool vis[N];
int tme[N];bool state[N];
int n,m,cnt;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
void add(int u,int v,int d){
    cnt++;
    val[cnt]=d;
    to[cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}
struct node{
    int dis;
    int pos;
    bool operator <(const node &x )const{
        return x.dis<dis;
    }
};
priority_queue<node>q;
void dijkstra(int s){
    dis[s]=0;
    q.push((node){0,s});
    while(!q.empty()){
        node tmp=q.top();
        q.pop();
        int x=tmp.pos,d=tmp.dis;
        if(state[x]==0)continue;
        if(vis[x])continue;
        vis[x]=1;
        for(int i=head[x];i;i=nxt[i]){
            int y=to[i];
            if(state[y]==0)continue;
            if(dis[y]>dis[x]+val[i]){ 
                dis[y]=dis[x]+val[i];
                if(!vis[y]){
                    q.push((node){dis[y],y});
                }
            }
        }
    }
}
void init(int t){
	for(int i=0;i<n;++i){
		dis[i]=1e9;
		vis[i]=0;
		if(tme[i]<=t)state[i]=1;
	}
}
int main(){
    n=read();m=read();
    for(int i=0;i<n;++i)scanf("%d",&tme[i]);
    for(int i=0,u,v,w;i<m;++i){
        u=read();v=read();w=read();
        add(u,v,w);
        add(v,u,w);
    }int q;q=read();
    init(0);
    for(int i=0,x,y,t;i<q;++i){
    	x=read();y=read();t=read();
    	init(t);
    	if(state[x]==0||state[y]==0){
			printf("-1\n");continue;
		}
		dijkstra(x);
		if(dis[y]==1e9)printf("-1\n");
		else printf("%d\n",dis[y]);
    }
    return 0;
}

记录

2021/9/22 19:51
加载中...