假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
1、以终点 2 为起点 dijkstra;
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
1、以终点 2 为起点 dijkstra;
2、直接DFS记忆化搜索。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX 1010
#define INF 99999999
using namespace std;
int n,m;
int g[MAX][MAX],dis[MAX],vis[MAX],is[MAX];
void init()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
g[i][j]=INF;dis[i]=INF;
}
}
for(int i=0;i<=n;i++)g[i][i]=0;
memset(vis,0,sizeof(vis));
memset(is,0,sizeof(is));
}
void dijkstra(int s)
{
int k,mm;
for(int i=1;i<=n;i++)
{
dis[i]=g[s][i];
}
vis[s]=1;
dis[s]=0;
for(int i=2;i<=n;i++)
{
mm=INF;
k=s;//这句话很重要啊!!害我RE了好多次,有可能木有啊
for(int j=1;j<=n;j++)
{
if(!vis[j])
{
if(mm>dis[j])
{
mm=dis[j];
k=j;
}
}
}
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j])
{
if(dis[j]>mm+g[k][j])
{
dis[j]=mm+g[k][j];
}
}
}
}
}
int dfs(int s)
{
if(is[s]) return is[s];
if(s==2)return 1;
int res=0;
for(int i=1;i<=n;i++)
{
if(g[s][i]<INF&&dis[s]>dis[i])
{
is[s]+=dfs(i);
}
}
return is[s];
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
init();
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
g[b][a]=g[a][b]=d;
}
dijkstra(2);
printf("%d\n",dfs(1));
}
return 0;
}