Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define L(i, m, n) for(int i(m);i < n;i++)
- #define pb push_back
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define in(x) cin >> x
- #define SZ(X) int(X.size())
- #define clr(A, V) L(i, 0, 111) A[i]=V
- #define ff first
- #define ss second
- #define RF(X) freopen(X, "r", stdin)
- #define WF(X) freopen(X, "w", stdout)
- using namespace std;
- typedef long long ll;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef vector<vi> vii;
- typedef pair<int,int> pii;
- typedef vector<pii> vpii;
- typedef pair<int, string> pis;
- typedef vector<string> vs;
- typedef pair<pair<int, int>, pair<int, int > > piiii;
- const int INF=1e9;
- int N, M, Q, x, y, l, globalMaxMin=0;
- vector <vpii> AdjList(500009);
- vector <pii> saveAnswers(500009);
- vector <bool> vis(500009, 0);
- vi lengths(5000009,INF);
- vi dist(500009, INF); /**Don't forget to check nodes number and memset each test**/
- void Dijkstra(int &s){
- dist[s] = 0; /** INF = 1B to avoid overflow**/
- priority_queue< pii, vpii, greater<pii> > pq; /**parameters**/
- pq.push({0, s});
- lengths[0]=1;
- while (!pq.empty()){
- pii front = pq.top(); pq.pop(); int d=front.ff,u=front.ss;
- if (d > dist[u]) continue; /** Lazy Deletion **/
- L(j,0,SZ(AdjList[u])){
- pii v = AdjList[u][j];/**first vertex number, weight second**/
- if (dist[u]+v.ss < dist[v.ff]){
- lengths[dist[u]+v.ss] == INF ? lengths[dist[u]+v.ss] = 1 :lengths[dist[u]+v.ss]++;
- globalMaxMin = max(globalMaxMin, dist[u]+v.ss);
- if(dist[v.ff] !=INF) lengths[dist[v.ff]]--;
- dist[v.ff] = dist[u] + v.ss; /** relax operation**/
- pq.push(pii(dist[v.ff], v.ff));
- }
- }
- } /** this variant can cause duplicate items in the priority queue**/
- }
- void init(){
- for(int i = 0;i < 500009;i++) vis[i]=0, dist[i]=INF;
- for(int i = 0;i < 5000009;i++) lengths[i]=INF;
- globalMaxMin=0;
- }
- int main(){
- scanf("%d%d%d", &N, &M, &Q);
- L(i,0,M){
- scanf("%d%d%d", &x, &y, &l);
- if(x!=y){
- AdjList[x].pb({y,l});
- AdjList[y].pb({x,l});
- }
- }
- L(i, 0, Q){
- init();
- scanf("%d", &x);
- if(!vis[x]){
- Dijkstra(x);
- saveAnswers[x].ff=globalMaxMin; saveAnswers[x].ss=lengths[globalMaxMin];
- vis[x]=1;
- }
- printf("%d %d\n", saveAnswers[x].ff, saveAnswers[x].ss);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement