题目:P1144 最短路计数
他们居然说是水题,看来我还是太low了。
用spfa求最短路,然后记录有多少个相同的到该点的最短路。
你忽略了重边了吗?
# include <iostream>
# include <vector>
# include <queue>
using namespace std;
const int maxn = 0x7fffffff / 3;
int n, m, dis[1000010], ans[1000010], u, v; // dis记录1到其它点的最短路, ans保存最短路个数
vector<int> map[1000010];
bool vis[1000010];
queue<int> s;
void spfa(int root) {
for(int i = 1; i <= n; i++) dis[i] = maxn; // 到每个点最短路距离为无穷大
s.push(root); vis[root] = true; // 入队,访问
ans[root] = 1; dis[root] = 0; // ans到本身为1个最短路, dis到本身最短路为0
while(!s.empty()) { // 队列不空就要继续
u = s.front(); s.pop(); // 取出队列,出队
for(int i = 0; i < map[u].size(); i++) { // 枚举u的每一条边
v = map[u][i];
if(dis[v] >