记忆化搜索+dfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int map[1005][1005];
bool visit[1005];
int dist[1005];
int sum[1005];
const int INF=0x7fffff;
struct node
{
int x,y;
};
queue<int> q;
void BFS()
{
int i,now;
memset(visit,false,sizeof(visit));
for(i=0;i<=n;i++) dist[i]=INF;
while(!q.empty()) q.pop();
dist[2]=0;
q.push(2);
visit[2]=true;
while(!q.empty())
{
now=q.front();
q.pop();
visit[now]=false;
for(i=1;i<=n;i++)
{
if(dist[i]>dist[now]+map[now][i])
{
dist[i]=dist[now]+map[now][i];
if(visit[i]==false)
{
q.push(i);
visit[i]=true;
}
}
}
}
}
int dfs(int now)
{
int i,sum1=0;
if(now==2) return 1;
if(sum[now]) return sum[now];
for(i=1;i<=n;i++)
{
if(map[now][i]<INF&&dist[now]>dist[i])
{
if(sum[i]) sum1+=sum[i];
else sum1+=dfs(i);
}
}
sum1+=sum[now];
sum[now]=sum1;
return sum[now];
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(sum,0,sizeof(sum));
scanf("%d",&m);
int s,t,v;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=INF;
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&s,&t,&v);
if(v<map[s][t])
map[s][t]=map[t][s]=v;
}
BFS();
// for(int i=0;i<=n;i++) cout<<dist[i]<<' ';
// cout<<endl;
int sum1=dfs(1);
printf("%d\n",sum1);
}
return 0;
}