最短路 + 记忆化搜索dfs
科普一下 spfa
http://hi.baidu.com/qw4365/item/f9a4fa3077224df4a9842809


#include <stdio.h> #include <string.h> #include <algorithm> using std::sort; const int INF = (1<<30)-1, MAXN = 1005; bool set[MAXN]; int dis[MAXN], n, m, r[MAXN][MAXN], cnt, count[MAXN]; struct node { int dis, index; }nDis[MAXN]; void dij(int src) { int i, j, min, pos; for(i=1; i<=n; i++) dis[i] = r[src][i]; memset(set, 0 ,sizeof(set)); dis[src] = 0; for(i=1; i<=n; i++) { min = pos = INF ; for(j=1; j<=n; j++) if(!set[j] && min > dis[j]) { min = dis[j], pos = j; } if(pos == INF) return ; set[pos] = 1; for(j=1; j<=n; j++) if(!set[j] && dis[j] > dis[pos] + r[pos][j]) dis[j] = dis[pos] + r[pos][j]; } } int dfs(int t) { if(dis[t] == 0) { return 1; } if( count[t] > 0 ) return count[t]; for(int i=1; i<=n; i++) { if(r[t][i]!=INF && dis[i] < dis[t]) count[t] += dfs(i); } return count[t]; } int main() { int a, b, c, i, j; while(scanf("%d", &n), n!=0) { scanf("%d", &m); memset(count, 0, sizeof(count)); for(i=1; i<=n; i++) for(j=1; j<=n; j++) r[i][j] = r[j][i] = INF; for(i=1; i<=m; i++) { scanf("%d %d %d", &a, &b, &c); r[a][b] = r[b][a] = c; } dij(2); dfs(1); printf("%d\n", count[1]); } return 0; }