main
黄海 2 years ago
parent c0d8b485d0
commit 4fa408495d

@ -94,25 +94,25 @@ void add(int a, int b) {
} }
int cnt[N]; // 从顶点1开始到其他每个点的最短路有几条 int cnt[N]; // 从顶点1开始到其他每个点的最短路有几条
int dist[N]; //最短距离 int dis[N]; // 最短距离
int n, m; int n, m;
void bfs() { void bfs() {
memset(dist, 0x3f, sizeof dist); memset(dis, 0x3f, sizeof dis);
queue<int> q; queue<int> q;
q.push(1); q.push(1);
cnt[1] = 1; // 从顶点1开始到顶点1的最短路有1条 cnt[1] = 1; // 从顶点1开始到顶点1的最短路有1条
dist[1] = 0; //距离为0 dis[1] = 0; // 距离为0
while (q.size()) { while (q.size()) {
int u = q.front(); int u = q.front();
q.pop(); q.pop();
for (int i = h[u]; ~i; i = ne[i]) { for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i]; int j = e[i];
if (dist[j] > dist[u] + 1) { if (dis[j] > dis[u] + 1) {
dist[j] = dist[u] + 1; dis[j] = dis[u] + 1;
q.push(j); q.push(j);
cnt[j] = cnt[u]; cnt[j] = cnt[u];
} else if (dist[j] == dist[u] + 1) } else if (dis[j] == dis[u] + 1)
cnt[j] = (cnt[j] + cnt[u]) % MOD; cnt[j] = (cnt[j] + cnt[u]) % MOD;
} }
} }
@ -141,7 +141,7 @@ const int MOD = 100003;
int n, m; int n, m;
int cnt[N]; int cnt[N];
int dist[N]; int dis[N];
bool st[N]; bool st[N];
int h[N], e[M], ne[M], idx; int h[N], e[M], ne[M], idx;
void add(int a, int b) { void add(int a, int b) {
@ -149,30 +149,29 @@ void add(int a, int b) {
} }
void dijkstra() { void dijkstra() {
memset(dist, 0x3f, sizeof dist); memset(dis, 0x3f, sizeof dis);
dist[1] = 0; dis[1] = 0;
// 出发点到自己的最短路径只能有1条 cnt[1] = 1; // 出发点到自己的最短路径有1条长度是0
cnt[1] = 1;
// 小顶堆q // 小顶堆q
priority_queue<PII, vector<PII>, greater<PII>> pq; priority_queue<PII, vector<PII>, greater<PII>> q;
pq.push({0, 1}); q.push({0, 1});
while (pq.size()) { while (q.size()) {
auto t = pq.top(); auto t = q.top();
pq.pop(); q.pop();
int u = t.second, d = t.first; int u = t.second;
if (st[u]) continue; if (st[u]) continue;
st[u] = true; st[u] = true;
for (int i = h[u]; ~i; i = ne[i]) { for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i]; int j = e[i];
if (dist[j] > d + 1) { if (dis[j] > dis[u] + 1) {
dist[j] = d + 1; dis[j] = dis[u] + 1;
cnt[j] = cnt[u]; cnt[j] = cnt[u];
pq.push({dist[j], j}); q.push({dis[j], j});
} else if (dist[j] == d + 1) } else if (dis[j] == dis[u] + 1)
cnt[j] = (cnt[j] + cnt[u]) % MOD; cnt[j] = (cnt[j] + cnt[u]) % MOD;
} }
} }

@ -8,25 +8,25 @@ void add(int a, int b) {
} }
int cnt[N]; // 从顶点1开始到其他每个点的最短路有几条 int cnt[N]; // 从顶点1开始到其他每个点的最短路有几条
int dist[N]; //最短距离 int dis[N]; // 最短距离
int n, m; int n, m;
void bfs() { void bfs() {
memset(dist, 0x3f, sizeof dist); memset(dis, 0x3f, sizeof dis);
queue<int> q; queue<int> q;
q.push(1); q.push(1);
cnt[1] = 1; // 从顶点1开始到顶点1的最短路有1条 cnt[1] = 1; // 从顶点1开始到顶点1的最短路有1条
dist[1] = 0; //距离为0 dis[1] = 0; // 距离为0
while (q.size()) { while (q.size()) {
int u = q.front(); int u = q.front();
q.pop(); q.pop();
for (int i = h[u]; ~i; i = ne[i]) { for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i]; int j = e[i];
if (dist[j] > dist[u] + 1) { if (dis[j] > dis[u] + 1) {
dist[j] = dist[u] + 1; dis[j] = dis[u] + 1;
q.push(j); q.push(j);
cnt[j] = cnt[u]; cnt[j] = cnt[u];
} else if (dist[j] == dist[u] + 1) } else if (dis[j] == dis[u] + 1)
cnt[j] = (cnt[j] + cnt[u]) % MOD; cnt[j] = (cnt[j] + cnt[u]) % MOD;
} }
} }

@ -6,7 +6,7 @@ const int MOD = 100003;
int n, m; int n, m;
int cnt[N]; int cnt[N];
int dist[N]; int dis[N];
bool st[N]; bool st[N];
int h[N], e[M], ne[M], idx; int h[N], e[M], ne[M], idx;
void add(int a, int b) { void add(int a, int b) {
@ -14,30 +14,29 @@ void add(int a, int b) {
} }
void dijkstra() { void dijkstra() {
memset(dist, 0x3f, sizeof dist); memset(dis, 0x3f, sizeof dis);
dist[1] = 0; dis[1] = 0;
// 出发点到自己的最短路径只能有1条 cnt[1] = 1; // 出发点到自己的最短路径有1条长度是0
cnt[1] = 1;
// 小顶堆q // 小顶堆q
priority_queue<PII, vector<PII>, greater<PII>> pq; priority_queue<PII, vector<PII>, greater<PII>> q;
pq.push({0, 1}); q.push({0, 1});
while (pq.size()) { while (q.size()) {
auto t = pq.top(); auto t = q.top();
pq.pop(); q.pop();
int u = t.second, d = t.first; int u = t.second;
if (st[u]) continue; if (st[u]) continue;
st[u] = true; st[u] = true;
for (int i = h[u]; ~i; i = ne[i]) { for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i]; int j = e[i];
if (dist[j] > d + 1) { if (dis[j] > dis[u] + 1) {
dist[j] = d + 1; dis[j] = dis[u] + 1;
cnt[j] = cnt[u]; cnt[j] = cnt[u];
pq.push({dist[j], j}); q.push({dis[j], j});
} else if (dist[j] == d + 1) } else if (dis[j] == dis[u] + 1)
cnt[j] = (cnt[j] + cnt[u]) % MOD; cnt[j] = (cnt[j] + cnt[u]) % MOD;
} }
} }

Loading…
Cancel
Save