题意:从办公室1到家2之间,有多条路可以走,求最短路径的道路共有多少条。
思路:先求出两点之间的最短路径,然后再利用搜索算法,搜索路径的条数。
感想:最短路径求解与搜索的结合,搜索的关键还是在于递归。
#include<iostream>
#include<stdio.h>
#include<string.h>
const intINF=10000000;
intmap[1005][1005];
intvis[1005],dis[1005];
int m,n;
intdp[1005];
void mp()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) map[i][j]=INF;
else map[i][j]=0;
}
voiddijkstra(int t)
{
int i,j,mmin,pos;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=map[t][i];
dis[t]=0;
vis[t]=1;
for(i=2;i<=n;i++)
{
mmin=INF;
for(j=1;j<=n;j++)
{
if(!vis[j]&&mmin>dis[j])
{
pos=j;
mmin=dis[j];
}
}
if(mmin==INF) break;
vis[pos]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[pos]+map[pos][j]<dis[j])
dis[j]=dis[pos]+map[pos][j];
}
}
}
intdfs(int p)
{
int i;
if(dp[p]!=-1)
return dp[p];
if(p==2)
return 1;
dp[p]=0;
for(i=1;i<=n;i++)
if(map[p][i]!=INF&&dis[p]>dis[i])
{
dp[p]=dp[p]+dfs(i);
}
return dp[p];
}
int main()
{
int i,a,b,c;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d",&m);
mp();
for(i=1;i<=m;i++)
{
scanf("%d %d%d",&a,&b,&c);
if(map[a][b]>c)map[a][b]=map[b][a]=c;
}
dijkstra(2);
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(1));
}
return 0;
}