为啥用Dijkstra会TLE最后四个点
查看原帖
为啥用Dijkstra会TLE最后四个点
677356
syzyc楼主2024/7/9 21:24

用BFS处理最短路全对,用Dijkstra会TLE最后四个点

#include <bits/stdc++.h>

#define mkpr make_pair

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int maxn = 1e5 + 7;
const int inf  = 0x3f3f3f3f;

int n, m, T;

vector<int> e[maxn];

int dis[maxn][2];   
struct node{
	int u, dis;
	bool operator<(const node& a) const{
		return this -> dis < a.dis; 
	}
};
priority_queue<node> q;
void Dijkstra() {
	memset(dis, inf, sizeof(dis));
	dis[1][0] = 0;
	q.push(node{1, 0});
	
	while (!q.empty()) {
		int u = q.top().u; 
		int d = q.top().dis;
		q.pop();
		
		for (int v : e[u]) {
	    	if (d & 1) {
				if (d + 1 < dis[v][0])
				    dis[v][0] = d + 1, q.push(node{v, d + 1});
			} else {
				if (d + 1 < dis[v][1])
					dis[v][1] = d + 1, q.push(node{v, d + 1});
			}
		}
	}
}
int main() {
	
	
	scanf("%d%d%d", &n, &m, &T);
	for (int i = 1; i <= m; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
		e[v].push_back(u); 
	}
	
	Dijkstra();
	
	while (T--) {
		int a, L;
		scanf("%d%d", &a, &L);
		if (L & 1) {
			if (dis[a][1] > L) printf("No\n");
			else printf("Yes\n");
		} else {
		    if (dis[a][0] > L) printf("No\n");
			else printf("Yes\n");
		}
	}
    return 0;
}
2024/7/9 21:24
加载中...