题目:https://www.luogu.org/problem/P1144
题目描述
给出一个
输入格式
第一行包含22个正整数
接下来
输出格式
共
题解
我们开一个
所以,我们只需多加下面的代码即可:
if (dis[v] == dis[u] + 1) ans[v] = (ans[v] + ans[u]) % 100003;
Code
#include <algorithm> #include <iostream> #include <queue> #define maxn 2000002 #define endl '\n' #define pairs pair<int, int> #define mod % 100003 using namespace std; struct node { int to, next; } edge[maxn << 1]; int n, m; int head[maxn], num; int vis[maxn], dis[maxn]; long long ans[maxn]; inline void add_edge (int from, int to) { edge[++num].next = head[from]; edge[num].to = to; head[from] = num; } inline void dijkstra (int x) { ans[x] = 1; for (register int i = 1; i <= n; i++) dis[i] = 2147483647; priority_queue<pairs> q; dis[x] = 0; q.push (make_pair (0, 1)); while (!q.empty ()) { int u = q.top ().second; q.pop (); if (vis[u]) continue; vis[u] = 1; for (register int i = head[u]; i; i = edge[i].next) { int v = edge[i].to; if (dis[v] > dis[u] + 1) { dis[v] = dis[u] + 1; q.push (make_pair (-dis[v], v)); } if (dis[v] == dis[u] + 1) ans[v] = (ans[v] + ans[u])mod; } } } int main () { ios::sync_with_stdio (false); cin.tie (0); cout.tie (0); cin >> n >> m; for (register int i = 1; i <= m; i++) { int x, y; cin >> x >> y; add_edge (x, y); add_edge (y, x); } dijkstra (1); for (register int i = 1; i <= n; i++) cout << ans[i] << endl; return 0; }
Comments NOTHING