题意:看样子很多人都把这题目看错了,以为是求最短路的条数。真正的意思是:假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
分析:1、以终点 2 为起点 dijkstra;
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
分析:1、以终点 2 为起点 dijkstra;
2、直接DFS记忆化搜索。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int map[1005][1005],dis[1005],vis[1005],dp[1005];
int n,m;
void prim()
{
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
dis[i]=map[2][i];
dis[2]=0;//以前没注意到这错了好多遍
vis[2]=1;
for(int i=1; i<=n; i++)
{
int minl=INF,pos;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&minl>dis[j])
{
minl=dis[j];
pos=j;
}
}
if(minl==INF)
break;
vis[pos]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[pos]+map[pos][j])
dis[j]=dis[pos]+map[pos][j];
}
}
}
int DFS(int v)
{
int sum=0;
if(dp[v]!=-1)
return dp[v];
if(v==2)
return 1;
for(int i=1;i<=n;i++)
{
if(map[v][i]!=INF&&dis[v]>dis[i])
sum+=DFS(i);
}
dp[v]=sum;
return dp[v];
}
int main()
{
int u,v,w;
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(map,INF,sizeof(map));
for(int i=1;i<=n;i++)
dp[i]=-1;
for(int i=0; i<m; i++)
{
scanf("%d %d %d",&u,&v,&w);
if(map[u][v]>w)
{
map[u][v]=w;
map[v][u]=w;
}
}
prim();
printf("%d\n",DFS(1));
}
return 0;
}