卡场求助
查看原帖
卡场求助
551559
sEa1nn013uR1o楼主2025/1/13 17:20
#include <ostream>
#include <istream>
#include <vector>
#include <queue>
char buf[1 << 20],*p1,*p2;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin), p1 == p2) ? 0 : *p1++)
inline int read(){
    register bool f = 1;
    register int x = 0;
    register char ch = getchar();
    while (ch < '0' || ch > '9'){
        if (ch == '-') f = !f;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9'){
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= f;
    return x;
}
inline void write(int x){
    if (x < 0) putchar('-'),x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
int dis[201],t[201],qq;
short n,m;
struct node{
    short id;
    int dis;
    bool operator < (const node & a) const{
        return dis > a.dis;
    }
};
struct p{
    short first,second;
};
std::vector<p> e[201];
void dij(short s,int ttt){
	std::priority_queue<node> q;
	bool vis[201] = {};
	for (register short i(n);i >= 1;--i) dis[i] = 2147483647;
    dis[s] = 0;
    q.push(node{s,0});
    while (q.size()){
        short uu = q.top().id;
        q.pop();
        if (vis[uu]) continue;
        vis[uu] = true;
        for (register int i(0);i < e[uu].size();++i){
        	if (t[e[uu][i].first] > ttt) continue;
            if (dis[e[uu][i].first] > dis[uu] + e[uu][i].second){
                dis[e[uu][i].first] = dis[uu] + e[uu][i].second;
                if (!vis[e[uu][i].first]) q.push({e[uu][i].first,dis[e[uu][i].first]});
            }
        }
    }
}
main(){
    n = read();
    m = read();
    for (register short i(1);i <= n;++i) t[i] = read();
    for (register int i(m);i >= 1;--i){
        int u = read() + 1,v = read() + 1,w = read();
        e[u].emplace_back(p{v,w}),e[v].emplace_back(p{u,w});
    }
    qq = read();
    for (register int i(qq);i >= 1;--i){
		int x = read(),y = read(),tt = read();
        ++x,++y;
        if (t[x] > tt || t[y] > tt){
            putchar('-');
            putchar('1');
            putchar('\n');
            continue;
        }
		dij(x,tt);
		if (dis[y] == 2147483647){
		    putchar('-');
            putchar('1');
            putchar('\n');
		}
		else{
		    write(dis[y]);
		    putchar('\n');
		}
	}
    return 0;
}

https://www.luogu.com.cn/record/198058472 用dij做的,T一个点。就差0.01s啊啊啊

2025/1/13 17:20
加载中...