| 
	
	
		
			http://acm.hdu.edu.cn/showproblem.php?pid=1142
 #include<iostream> 
  using namespace std; 
  int n;//十字路口数 
  int map[1001][1001]; 
  int dist[1001],dp[1001]; 
  void dijkstra(int v)//迪杰斯特拉算法 
    { 
  int i,j,mins,index; 
  int *s = new int[n+1]; 
  for(i=1;i<=n;i++) 
     { 
  dist[i] = map[i][v]; 
  s[i] = 0; 
  } 
  dist[v] = 0; 
  s[v] = 1; 
  for(i=1;i<n;i++) 
     { 
  mins = 2000000; 
  for(j=1;j<=n;j++) 
     { 
  if(s[j]==0 && dist[j]<mins) 
     { 
  mins = dist[j]; 
  index = j; 
  } 
  } 
  if(mins == 2000000) 
  break; 
  s[index] = 1; 
  for(j=1;j<=n;j++) 
     { 
  if(s[j]==0 && dist[j]>dist[index]+map[j][index]) 
  dist[j] = dist[index]+map[j][index]; 
  } 
  } 
  } 
  
  int dfs(int v)//记忆法深搜 
    { 
  if(dp[v] != -1) 
  return dp[v]; 
  if(v == 2) 
  return 1; 
  int i,temp,sum=0; 
  for(i=1;i<=n;i++) 
     { 
  if(map[v][i]!=2000000 && dist[v] > dist[i])//有路相通而且要去的i点到终点站的距离要比v到终点站的距离小 
     { 
  temp = dfs(i); 
  sum += temp; 
  } 
  } 
  dp[v] = sum; 
  return sum; 
  } 
  
  int main() 
    { 
  while(cin>>n && n) 
     { 
  int i,j,d,m; 
  cin>>m; 
  for(i=1;i<=n;i++) 
     { 
  dp[i] = -1; 
  for(j=1;j<=n;j++) 
  map[i][j] = 2000000; 
  } 
  while(m--) 
     { 
  scanf("%d%d%d",&i,&j,&d); 
  map[i][j] = map[j][i] = d;//无向图 
  } 
  //求出各点到终点站的最短距离 
  dijkstra(2);//2为终点站 
  dfs(1);//从1出发 
  cout<<dp[1]<<endl; 
  } 
  return 0; 
  }     |