假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
#include "stdio.h"
#include "string.h"
const int maxn = 1005;
const int inf = 1<<29;
int map[maxn][maxn],dis[maxn],dp[maxn];
int n,m,count;
void Dijkstra(int x)
{
int i,j;
bool vis[maxn] = {false};
dis[x] = 0;
for( i=1;i<n;i++ )
{
int temp = inf;
int p = x;
for( j=1;j<=n;j++ )
{
if( !vis[j] && dis[j] < temp )
{
temp = dis[p=j];
}
}
vis[p] = true;
for( j=1;j<=n;j++ )
{
if( !vis[j] && dis[j] > dis[p] + map[p][j] )
{
dis[j] = dis[p] + map[p][j];
}
}
}
}
int DFS( int x )
{
if( dp[x]!=-1 )
return dp[x];
if( x==2 )
return 1;
dp[x] = 0;
for( int i=1;i<=n;i++ )
{
if( map[x][i]<inf && dis[x] > dis[i] )
{
dp[x] += DFS( i );
}
}
return dp[x];
}
int main()
{
int i,j,a,b,c;
while( scanf("%d",&n)!=EOF && n)
{
memset( dp,-1,sizeof(dp) );
for( i=0;i<=n;i++ )
{
for( j=i;j<=n;j++ )
map[i][j] = map[j][i] = inf;
dis[i] = inf;
}
scanf("%d",&m);
for( i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b] = map[b][a] = map[a][b]>c?c:map[a][b];
}
Dijkstra(2);
printf("%d\n",DFS(1) );
}
return 0;
}