Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <queue>
- #include <vector>
- #include <iostream>
- using namespace std;
- using ll=long long;
- typedef pair <ll, ll> pii;
- typedef pair <ll, ll> pli;
- const int N = 100005;
- const long long oo = (long long) 1000000000 * 1000000000;
- vector <pii> edges[N];
- const ll mod=1e9+7;
- ll n, m ,d[N],trace[N],pre[N];
- void readData ()
- {
- cin >> n>>m ;
- for (int i = 1; i <=m; i++) {
- int u, v, w;
- cin >> u >> v >> w;
- edges[u].push_back(make_pair(v, w)); // Cho dinh v ke voi dinh u voi trong so canh (u, v) la `w`
- edges[v].push_back(make_pair(u, w)); // Do thi vo huong
- }
- }
- void initData () {
- for (int i = 1; i<N; i++)
- edges[i].clear();
- for (int i = 1; i <N; i++)
- d[i] = oo;
- for (int i = 1; i <N; i++)
- trace[i] = -1;
- pre[1]=1;
- }
- bool relax (const int u, const int v, const int w) {
- if (d[v] > d[u] + w)
- {
- d[v] = d[u] + w;
- trace[v] = u;
- pre[v]=pre[u];
- return true;
- }
- else if(d[v]==d[u]+w)
- {
- pre[v]+=pre[u];
- pre[v]%=mod;
- }
- return false;
- }
- void dijkstra (const int S) {
- d[S] = 0;
- priority_queue <pli, vector <pli>, greater <pli> > pq;
- pq.push(make_pair(0, S)); // Cho S vao queue
- while (!pq.empty()) {
- ll u=pq.top().second;
- ll dis=pq.top().first;
- pq.pop();
- for(auto edge:edges[u])
- {
- ll v=edge.first;
- ll w=edge.second;
- if(d[v]>dis+w)
- {
- pq.push({dis+w,v});
- d[v]=dis+w;
- pre[v]=pre[u];
- }
- else if(d[v]==d[u]+w)
- {
- pre[v]=pre[v]+pre[u];
- pre[v]%=mod;
- }
- }
- }
- }
- int main() {
- initData();
- readData();
- dijkstra (1);
- for(int i=1;i<=n;i++)
- {
- if(d[i]==oo)
- {
- cout << -1 <<' '<<0<<'\n';
- continue;
- }
- cout << d[i]<<' '<<pre[i]<<'\n';
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment