A Walk Through the Forest
The forest is beautiful, and Jimmy wants to take a different route everyday. He also wants to get home before dark, so he always takes a path to make progress towards his house. He considers taking a path from A to B to be progress if there exists a route from B to his home that is shorter than any possible route from A. Calculate how many different routes through the forest Jimmy might take.
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<algorithm>
#define inf 10000000000
using namespace std;
long long w[1005][1005];
int v[1005];
long long d[1005];
int f[1005];
int n;
void solve()
{
memset(v,0,sizeof(v));
for(int i=1 ; i <= n ; i++)
d[i]=inf;
d[2]=0;
for(int i=0 ; i < n ; i++)
{
long long x,m=inf;
for(int y=1 ; y <= n ; y++)
if(!v[y]&&d[y]<=m)
m=d[x=y];
v[x]=1;
for(int y=1; y <=n ; y++)
{
if(d[y]>d[x]+w[x][y])
{
d[y]=d[x]+w[x][y];
}
}
}
}
int dfs(int pos)
{
if(pos == 2) return 1;
if(f[pos]) return f[pos];
int xx=0;
for(int i=1 ; i <= n ; i++)
{
if(w[pos][i]>=inf) continue;
if(d[pos] > d[i])
{
// printf("pos=%d i=%d c=%d\n",pos,i,w[pos][i]);
xx+=dfs(i);
}
}
return f[pos]=xx;
}
int main()
{
int m,i,j,a,b;
long long c;
while(scanf("%d",&n)&&n)
{
if(n == 0) break;
scanf("%d",&m);
memset(f,0,sizeof(f));
for(i=0 ; i <= n ; i++)
for(j=0 ; j <= n ; j++)
w[j][i]=w[i][j]=inf;
for(i=0 ; i < m ; i++)
{
scanf("%d%d%lld",&a,&b,&c);
w[a][b]=w[b][a]=c;
}
solve();
// for(int i=1 ; i <= n ; i++)
// printf("%d ",f[i]);
printf("%d\n",dfs(1));
}
return 0;
}