思路:
spfa+dp,用spfa更新dis的同时,dp记录条数。
伪代码:
void spfa() { for(int i = 1; i <= n; i++) { dp[i] = 0; dis[i] = inf; } dis[1] = 0; dp[1] = 1; //优化 queue<int> q; q.push(1); while(!q.empty()) { int now = q.front(); q.pop(); for(int i = 0; i < m[now].size(); i++) { int to = m[now][i]; if(dis[to] > dis[now]+1) { dis[to] = dis[now] + 1; dp[to] = dp[now]; //顺畅的一条路 q.push(to); } else if(dis[to] == dis[now] + 1) dp[to] += dp[now]; //遇到了分叉,前面的点已经被其他路走到过 } } } //dp[n]即为1到n最短路条数
例题: