5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0
2 4
思路:
用spfa求出2到各个点之间的距离,然后从1找出有多少条可以到2的点。同时用到了深搜
源码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
const int M = 1007;
const int INF = 0x3f3f3f3f;
using namespace std;
int map[M][M], d[M], ans[M];
int n, m;
bool vis[M];
void spfa(int u){
for(int i = 1; i <= n; ++ i){
d[i] = INF; vis[i] = 0;
}
vis[u] = 1; d[u] = 0;
queue<int > q;
q.push(u);
while(!q.empty()){
int temp = q.front(); q.pop(); vis[temp] = 0;
for(int i = 1; i <= n; ++ i){
if(d[i] > d[temp]+map[temp][i]){
d[i] = d[temp]+map[temp][i];
if(!vis[i]){
vis[i] = 1;
q.push(i);
}
}
}
}
}
int dfs(int u){
if(ans[u] != -1) return ans[u];
if(u == 2) return 1;
ans[u] = 0;
for(int i = 1; i <= n; ++ i){
if(map[u][i] != INF&&d[i] < d[u]){
ans[u] += dfs(i);
}
}
return ans[u];
}
int main(){
while(scanf("%d", &n), n){
scanf("%d", &m);
for(int i = 0; i <= n; ++ i){
for(int j = 0; j <= n; ++ j){
map[i][j] = (i == j?0:INF);
}
}
int a, b, c;
for(int i = 0; i < m; ++ i){
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = min(c, map[a][b]);
}
spfa(2);
memset(ans, -1, sizeof(ans));
printf("%d\n", dfs(1));
}
}