Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <set>
- #include <vector>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- #define MAX_N 100000
- #define trav(it, cont) for(typeof(cont.begin()) it = cont.begin(); it != cont.end(); it++)
- typedef pair<int, int> pii;
- vector<vector<pii> > adj;
- int visited[MAX_N];
- int best[MAX_N];
- int secondBest[MAX_N];
- int travel_plan(int N, int M,int R[][2],int L[], int K, int P[]){
- //in case called again - not sure how the IOI judge would do
- adj.clear();
- adj.resize(N);
- memset(visited, 0, sizeof(visited));
- memset(best, -1, sizeof(best));
- memset(secondBest, -1, sizeof(secondBest));
- for(int i = 0; i<M; i++){
- int t = R[i][0];
- int f = R[i][1];
- adj[t].push_back(pii(f, L[i]));
- adj[f].push_back(pii(t, L[i]));
- }
- set<pii> pq;
- for(int i = 0; i<K; i++){
- pq.insert(pii(0, P[i]));
- }
- while(!pq.empty()){
- pii v = *(pq.begin());
- pq.erase(pq.begin());
- trav(u, adj[v.second]) {
- pii uu = *u;
- visited[uu.first]++;
- int distance = uu.second + v.first;
- if(visited[uu.first] == 1){
- best[uu.first] = distance;
- } else if(visited[uu.first] == 2){
- int lowest = min(best[uu.first], distance);
- int highest = max(best[uu.first], distance);
- best[uu.first] = lowest;
- secondBest[uu.first] = highest;
- pq.insert(pii(highest, uu.first));
- } else {
- if(distance > secondBest[uu.first]) continue;
- pq.erase(pii(secondBest[uu.first], uu.first));
- int bestX, secondBestX;
- if(distance < best[uu.first]){
- bestX = distance;
- secondBestX = best[uu.first];
- } else {
- bestX = best[uu.first];
- secondBestX = distance;
- }
- best[uu.first] = bestX;
- secondBest[uu.first] = secondBestX;
- pq.insert(pii(secondBestX, uu.first));
- }
- }
- }
- return secondBest[0];
- }
- void case1(){
- int n = 5;
- int m = 4;
- int k = 3;
- int r[][2] = {
- {0, 1},
- {0, 2},
- {3, 2},
- {2, 4}
- };
- int l[] = {2, 3, 1, 4};
- int p[] = {1, 3, 4};
- printf("%d\n", travel_plan(n, m, r, l, k, p));
- }
- void case2(){
- int n = 5;
- int m = 7;
- int k = 2;
- int r[][2] = {
- {0, 2},
- {0, 3},
- {3, 2},
- {2, 1},
- {0, 1},
- {0, 4},
- {3, 4},
- };
- int l[] = {4, 3, 2, 10, 100, 7, 9};
- int p[] = {1, 3};
- printf("%d\n", travel_plan(n, m, r, l, k, p));
- }
- int main(){
- case1();
- case2();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement