求助,hack数据过了,普通数据没过
查看原帖
求助,hack数据过了,普通数据没过
543427
_sin_楼主2022/3/18 22:07

这是个玄学的问题,我hack的数据过了,普通数据没过,我也没有打表,这是为什么? 记录

代码如下

#include <bits/stdc++.h>
#define N 100005
#define M 200005
#define INF 0x3f
using namespace std;

struct Edge{
	int pre, v, w, u;
}edge[M];

int head[N], cnt = 0;
int n, m, k, p;
int u, v, w;
int dis[N];
bool vis[N];
int maxl;
int ans = 0;

inline void init(){
	Edge tmp;
	for (int i = 0; i <= M; i++){
		edge[i] = tmp;
	}
	memset(head, 0, sizeof(head));
	memset(dis, INF, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	cnt = 0;
	ans = 0;
}

inline void add(int u, int v, int w){
	edge[++cnt].v = v;
	edge[cnt].w = w;
	edge[cnt].pre = head[u];
	head[u] = cnt;
}

inline int dijkstra(){
	priority_queue<pair<int,int>, vector<pair<int, int> >, greater<pair<int, int> > >q;
	memset(vis, 0, sizeof(vis));
	memset(dis, INF, sizeof(dis));
	q.push(make_pair(1, 0));
	dis[1] = 0;
	while (q.size()){
		int tmp = q.top().first, tp;
		q.pop();
		if (vis[tmp]) continue ;
		vis[tmp] = 1;
		for (int i = head[tmp]; i; i = edge[i].pre){
			if(dis[edge[i].v] > dis[tmp]+edge[i].w){
				dis[edge[i].v] = dis[tmp]+edge[i].w;
				if (!vis[edge[i].v]){
					q.push(make_pair(edge[i].v, dis[edge[i].v]));
				}
			}
		}
	}
	return dis[n];
}

void dfs(int u, int sum){
	if (sum > maxl) return ;
	if (u == n){
		ans++;
		return ;
	} 
	if (vis[u]) return ;
	vis[u] = 1;
	for (int i = head[u]; i; i = edge[i].pre){
		if (!vis[edge[i].v]) dfs(edge[i].v, sum+edge[i].w);
	}
}

int main(){
	int t;
	scanf("%d", &t);
	while (t--){
		init();
		scanf("%d%d%d%d", &n, &m, &k, &p);
		for (int i = 1; i <= m; i++){
			scanf("%d%d%d", &u, &v, &w);
			add(u, v, w);
		}
		maxl = dijkstra()+k;
		memset(vis, 0, sizeof(vis));
		dfs(1, 0);
		if (ans == 0) printf("-1\n");
		else printf("%d\n", ans);
	}
	return 0;
} 
2022/3/18 22:07
加载中...