Dang_Quan_10_Tin

Untitled

Mar 2nd, 2020 (edited)
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1.  
  2. #include <queue>
  3. #include <vector>
  4. #include <iostream>
  5. using namespace std;
  6. using ll=long long;
  7. typedef pair <ll, ll> pii;
  8. typedef pair <ll, ll> pli;
  9.  
  10. const int N = 100005;
  11. const long long oo = (long long) 1000000000 * 1000000000;
  12. vector <pii> edges[N];
  13. const ll mod=1e9+7;
  14. ll n, m ,d[N],trace[N],pre[N];
  15. void readData ()
  16. {
  17.     cin >> n>>m ;
  18.     for (int i = 1; i <=m; i++) {
  19.         int u, v, w;
  20.         cin >> u >> v >> w;
  21.         edges[u].push_back(make_pair(v, w)); // Cho dinh v ke voi dinh u voi trong so canh (u, v) la `w`
  22.         edges[v].push_back(make_pair(u, w)); // Do thi vo huong
  23.     }
  24.  
  25. }
  26.  
  27. void initData () {
  28.  
  29.     for (int i = 1; i<N; i++)
  30.         edges[i].clear();
  31.  
  32.     for (int i = 1; i <N; i++)
  33.         d[i] = oo;
  34.  
  35.     for (int i = 1; i <N; i++)
  36.         trace[i] = -1;
  37.     pre[1]=1;
  38. }
  39.  
  40. bool relax (const int u, const int v, const int w) {
  41.     if (d[v] > d[u] + w)
  42.     {
  43.         d[v] = d[u] + w;
  44.         trace[v] = u;
  45.         pre[v]=pre[u];
  46.         return true;
  47.     }
  48.     else if(d[v]==d[u]+w)
  49.     {
  50.         pre[v]+=pre[u];
  51.         pre[v]%=mod;
  52.     }
  53.     return false;
  54. }
  55.  
  56. void dijkstra (const int S) {
  57.  
  58.     d[S] = 0;
  59.     priority_queue <pli, vector <pli>, greater <pli> > pq;
  60.     pq.push(make_pair(0, S)); // Cho S vao queue
  61.     while (!pq.empty()) {
  62.         ll u=pq.top().second;
  63.         ll dis=pq.top().first;
  64.         pq.pop();
  65.         for(auto edge:edges[u])
  66.         {
  67.             ll v=edge.first;
  68.             ll w=edge.second;
  69.             if(d[v]>dis+w)
  70.             {
  71.                 pq.push({dis+w,v});
  72.                 d[v]=dis+w;
  73.                 pre[v]=pre[u];
  74.             }
  75.             else if(d[v]==d[u]+w)
  76.             {
  77.                 pre[v]=pre[v]+pre[u];
  78.                 pre[v]%=mod;
  79.             }
  80.         }
  81.     }
  82. }
  83.  
  84. int main() {
  85.     initData();
  86.     readData();
  87.     dijkstra (1);
  88.     for(int i=1;i<=n;i++)
  89.     {
  90.         if(d[i]==oo)
  91.         {
  92.             cout << -1 <<' '<<0<<'\n';
  93.             continue;
  94.         }
  95.         cout << d[i]<<' '<<pre[i]<<'\n';
  96.     }
  97.     return 0;
  98. }
Add Comment
Please, Sign In to add comment