WA最后一个点BFS法求助
查看原帖
WA最后一个点BFS法求助
500803
zzxzzxCCC楼主2024/7/17 14:31
#include <bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
const int N = 10010;
const int M = 20010;
const int K = 110;          
int n, m, k;
int head[N], e[M], w[M], ne[M], idx;
queue<PII> q;
int depth[N][K];
void add(int u, int v, int a){
	e[idx] = v;
	w[idx] = a;
	ne[idx] = head[u];
	head[u] = idx ++; 
}
int bfs(int start){
	memset(depth, -1, sizeof depth);
	q.push(make_pair(1, 0));
	depth[1][0] = start;
	while(q.size()){
		PII p = q.front(); q.pop();
		int u = p.first, x = p.second;
		for(int i = head[u] ; i != -1 ; i = ne[i]){
			int v = e[i], a = w[i];
			if(depth[v][(x + 1) % k] == -1 && depth[u][x] >= a) {
				q.push(make_pair(v, (x + 1) % k));
				depth[v][(x + 1) % k] = depth[u][x] + 1;  
			}       
		}
	}
	if(depth[n][0] != -1) return depth[n][0];
	return -1;
}
int main(){
	memset(head, -1, sizeof head);
	scanf("%d%d%d", &n, &m, &k);
	int mintime = 0, maxtime = 0;
	while(m --){
		int u, v, a;
		scanf("%d%d%d", &u, &v, &a);
		add(u, v, a);
		maxtime = max(maxtime, a);
	}
	int ans = 0x3f3f3f3f;
	int l = 0, r = 2 * maxtime / k + 1;
	while(l < r){
		int mid = (l + r) >> 1, res;
		if((res = bfs(mid * k)) != -1){
			r = mid;
			ans = min(ans, res); 
		}
		else l = mid + 1; 
	}
	if(ans != 0x3f3f3f3f) printf("%d", ans);
	else printf("-1\n");
	return 0;
}
2024/7/17 14:31
加载中...