您的位置:首页 > 编程语言 > C语言/C++

C++ P1144 最短路计数

2016-11-17 16:55 246 查看
题目: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] > dis[u] + 1) { // 如果满足u到v的距离会比原本到v的距离小,则更新
dis[v] = dis[u] + 1;
ans[v] = ans[u]; // v点和u点在一条路上,所以v的最短路个数等于u的最短路个数
if(vis[v] == false) vis[v] = true, s.push(v); // 没访问过v,则设访问过
} else if(dis[v] == dis[u] + 1) // 如果找到u到v的距离与到v的最短路距离一样
ans[v] = (ans[v] + ans[u]) % 100003; // 该点最短路个数为u最短路个数+v最短路个数
}
vis[u] = false;
}
}
int main() {
cin >> n >> m;
while(m--) {
cin >> u >> v;
map[u].push_back(v);
map[v].push_back(u);
}
spfa(1);
for(int i = 1; i <= n; i++) cout << ans[i] << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息