这是个玄学的问题,我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;
}