Advertisement
Insyder01

Untitled

May 20th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define L(i, m, n) for(int i(m);i < n;i++)
  3. #define pb push_back
  4. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  5. #define in(x) cin >> x
  6. #define SZ(X) int(X.size())
  7. #define clr(A, V) L(i, 0, 111) A[i]=V
  8. #define ff first
  9. #define ss second
  10. #define RF(X) freopen(X, "r", stdin)
  11. #define WF(X) freopen(X, "w", stdout)
  12. using namespace std;
  13. typedef long long ll;
  14. typedef pair<ll,ll> pll;
  15. typedef vector<int> vi;
  16. typedef vector<vi> vii;
  17. typedef pair<int,int> pii;
  18. typedef vector<pii> vpii;
  19. typedef pair<int, string> pis;
  20. typedef vector<string> vs;
  21. typedef pair<pair<int, int>, pair<int, int > > piiii;
  22.  
  23. const int INF=1e9;
  24. int N, M, Q, x, y, l, globalMaxMin=0;
  25. vector <vpii> AdjList(500009);
  26. vector <pii> saveAnswers(500009);
  27. vector <bool> vis(500009, 0);
  28. vi lengths(5000009,INF);
  29. vi dist(500009, INF); /**Don't forget to check nodes number and memset each test**/
  30. void Dijkstra(int &s){
  31.     dist[s] = 0; /** INF = 1B to avoid overflow**/
  32.     priority_queue< pii, vpii, greater<pii> > pq; /**parameters**/
  33.     pq.push({0, s});
  34.     lengths[0]=1;
  35.     while (!pq.empty()){
  36.         pii front = pq.top(); pq.pop(); int d=front.ff,u=front.ss;
  37.         if (d > dist[u]) continue; /** Lazy Deletion **/
  38.  
  39.         L(j,0,SZ(AdjList[u])){
  40.             pii v = AdjList[u][j];/**first vertex number, weight second**/
  41.             if (dist[u]+v.ss < dist[v.ff]){
  42.                 lengths[dist[u]+v.ss] == INF ? lengths[dist[u]+v.ss] = 1 :lengths[dist[u]+v.ss]++;
  43.                 globalMaxMin = max(globalMaxMin, dist[u]+v.ss);
  44.                 if(dist[v.ff] !=INF) lengths[dist[v.ff]]--;
  45.                 dist[v.ff] = dist[u] + v.ss; /** relax operation**/
  46.                 pq.push(pii(dist[v.ff], v.ff));
  47.  
  48.             }
  49.         }
  50.     } /** this variant can cause duplicate items in the priority queue**/
  51. }
  52. void init(){
  53.     for(int i = 0;i < 500009;i++) vis[i]=0, dist[i]=INF;
  54.     for(int i = 0;i < 5000009;i++) lengths[i]=INF;
  55.     globalMaxMin=0;
  56. }
  57.  
  58. int main(){
  59.     scanf("%d%d%d", &N, &M, &Q);
  60.     L(i,0,M){
  61.         scanf("%d%d%d", &x, &y, &l);
  62.         if(x!=y){
  63.             AdjList[x].pb({y,l});
  64.             AdjList[y].pb({x,l});
  65.         }
  66.     }
  67.     L(i, 0, Q){
  68.         init();
  69.         scanf("%d", &x);
  70.         if(!vis[x]){
  71.             Dijkstra(x);
  72.             saveAnswers[x].ff=globalMaxMin; saveAnswers[x].ss=lengths[globalMaxMin];
  73.             vis[x]=1;
  74.         }
  75.         printf("%d %d\n", saveAnswers[x].ff, saveAnswers[x].ss);
  76.     }
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement