代码及解释
#include <stdio.h>
#include <iostream>
#include <queue>
typedef struct n1 { int distens, flog; } node;
node N[1005];
int map[1005][1005], k;
int direct[1005];
void set(int n) {
int i, j, m, n1, n2, d;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
map[i][j] = -1;
}
N[i].distens = 10000000;
N[i].flog = 0;
direct[i] = 0;
}
scanf("%d", &m);
while (m--) {
scanf("%d%d%d", &n1, &n2, &d);
if (map[n1][n2] != 0 || map[n1][n2] > d)
map[n1][n2] = map[n2][n1] = d;
}
}
void spfa(int n) {
std::queue<int> Q;
int now;
int i;
N[2].distens = 0;
N[2].flog = 1;
Q.push(2);
while (!Q.empty()) {
now = Q.front();
Q.pop();
N[now].flog = 0;
for (i = 1; i <= n; i++)
if (map[now][i] != -1) {
if (N[i].distens > N[now].distens + map[now][i]) {
N[i].distens = N[now].distens + map[now][i];
if (N[i].flog == 0) {
N[i].flog = 1;
Q.push(i);
}
}
}
}
}
int DFS(int now, int n) {
int i;
if (direct[now] > 0)
return direct[now];
if (now == 2) {
return 1;
}
for (i = 1; i <= n; i++)
if (map[now][i] != -1 && N[now].distens > N[i].distens)
direct[now] += DFS(i, n);
return direct[now];
}
int main() {
int n;
while (scanf("%d", &n) > 0 && n) {
set(n);
spfa(n);
k = DFS(1, n);
printf("%d\n", k);
}
}