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;
}
他们居然说是水题,看来我还是太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;
}
相关文章推荐
- 洛谷 P1144 最短路计数
- 洛谷 P1144 最短路计数
- 洛谷 P1144 最短路计数
- P1144 最短路计数
- 洛谷P1144 最短路计数 及其引申思考
- 洛谷P1144 最短路计数(BFS)
- 洛谷P1144 最短路计数(spfa)
- P1144 最短路计数
- 洛谷P1144 最短路计数
- 洛谷 P1144 最短路计数
- 洛谷 P1144 最短路计数
- P1144 最短路计数
- 洛谷——P1144 最短路计数
- 洛谷P1144 最短路计数
- 图论-最短路-Dijkstra算法&Floyd算 c++
- c++引用计数实现
- C++如何使用简单的引用计数
- C++内存管理——引用计数
- C++学习笔记6,表达式的短路逻辑
- C++中将科学计数转换为其他类型