I solved this problem using Dijkstra and adjacency list to store graph... It is simple and straight forward however, I always get WA .... I tried test cases on spoj toolkit and all of them get the same answer. Is their any tricky test cases??
#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
int n, nodes[101], from[50010], to[50010], cost[50010], dist[101], tar;
pair<int, int> p;
int dijk(int cn)
{
memset(dist, 0x3f, sizeof(dist));
int far = 1;
priority_queue < pair<int, int> > q;
dist[cn] = 0;
q.push(make_pair(0, cn));
while(q.size())
{
int cnode = q.top().S, val = -q.top().F;
if(cnode == tar)return val;
q.pop();
for(int k = nodes[cnode]; k != -1; k = from[k])
{
p.F = cost[k] + dist[cnode]; p.S = to[k];
if(p.F < dist[p.S])
{
dist[p.S] = p.F;
q.push(make_pair(-p.F, p.S));
}
}
}
return 0x3f;
}
int main()
{
memset(nodes, -1, sizeof(nodes));
int nxt = 0, m, t, f, c, T, counter = 0;
scanf("%d%d%d%d", &n, &tar, &T, &m);
while(m--)
{
scanf("%d%d%d", &f, &t, &c);
from[nxt] = nodes[f];
nodes[f] = nxt;
to[nxt] = t;
cost[nxt] = c;
nxt++;
}
for(int i=1; i<=n; i++)
{
if(dijk(i) <= T)counter++;
}
cout<<counter<<endl;
return 0;
}