题意:
大概就是从A到B最短的距离确定,但是有几条路不确定,让你求有几条最短路。
思路:
求出最短路保存起来,遍历一遍数一下
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXN 1005
int cost[MAXN][MAXN];
int dis[MAXN];
int sum[MAXN];
#define INF 0x3f3f3f3f
#define typec int
int path[MAXN],vis[MAXN];
void Dijkstra(typec cost[][MAXN],typec lowcost[MAXN],int n,int beg)
{
int i,j;
typec minc;
memset(vis,0,sizeof(vis));
vis[beg]=1;
for(i=1;i<=n;i++)
{
lowcost[i]=cost[beg][i];path[i]=beg;
}
lowcost[beg]=0;
path[beg]=-1;
int pre;
for(int num=2;num<n;num++)
{
minc=INF;
for(j=1;j<=n;j++)
if(vis[j]==0&&lowcost[j]<minc)
{pre=j;minc=lowcost[j];}
if(minc>=INF)break;
vis[pre]=1;
for(j=1;j<=n;j++)
if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])
{lowcost[j]=lowcost[pre]+cost[pre][j];path[j]=pre;}
}
}
int dfs(int i,int n)
{
if(i==2) return 1;
if(sum[i]!=-1) return sum[i];
int cnt=0;
for(int j=1;j<=n;j++)
{
if(cost[i][j]<INF&&dis[j]<dis[i])
cnt+=dfs(j,n);
}
sum[i]=cnt;
return sum[i];
}
int main()
{
int i,j;
int n,m;
int a,b,d;
while(cin>>n&&n)
{
cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)cost[i][j]=0;
else cost[i][j]=INF;
}
while(m--)
{
cin>>a>>b>>d;
cost[a][b]=d;
cost[b][a]=d;
}
Dijkstra(cost,dis,n,2);
memset(sum,-1,sizeof(sum));
cout<<dfs(1,n)<<endl;
}
}