Advertisement
Guest User

Untitled

a guest
Jul 27th, 2011
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <set>
  2. #include <vector>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. #define MAX_N 100000
  10.  
  11. #define trav(it, cont) for(typeof(cont.begin()) it = cont.begin(); it != cont.end(); it++)
  12.  
  13. typedef pair<int, int> pii;
  14. vector<vector<pii> > adj;
  15. int visited[MAX_N];
  16. int best[MAX_N];
  17. int secondBest[MAX_N];
  18.  
  19. int travel_plan(int N, int M,int R[][2],int L[], int K, int P[]){
  20.   //in case called again - not sure how the IOI judge would do
  21.   adj.clear();
  22.   adj.resize(N);
  23.   memset(visited, 0, sizeof(visited));
  24.   memset(best, -1, sizeof(best));
  25.   memset(secondBest, -1, sizeof(secondBest));
  26.   for(int i = 0; i<M; i++){
  27.     int t = R[i][0];
  28.     int f = R[i][1];
  29.     adj[t].push_back(pii(f, L[i]));
  30.     adj[f].push_back(pii(t, L[i]));
  31.   }
  32.   set<pii> pq;
  33.   for(int i = 0; i<K; i++){
  34.     pq.insert(pii(0, P[i]));
  35.   }
  36.  
  37.   while(!pq.empty()){
  38.     pii v = *(pq.begin());
  39.     pq.erase(pq.begin());
  40.     trav(u, adj[v.second]) {
  41.       pii uu = *u;
  42.       visited[uu.first]++;
  43.       int distance = uu.second + v.first;
  44.       if(visited[uu.first] == 1){
  45.     best[uu.first] = distance;
  46.       } else if(visited[uu.first] == 2){
  47.     int lowest = min(best[uu.first], distance);
  48.     int highest = max(best[uu.first], distance);
  49.     best[uu.first] = lowest;
  50.     secondBest[uu.first] = highest;
  51.     pq.insert(pii(highest, uu.first));
  52.       } else {
  53.     if(distance > secondBest[uu.first]) continue;
  54.     pq.erase(pii(secondBest[uu.first], uu.first));
  55.     int bestX, secondBestX;
  56.     if(distance < best[uu.first]){
  57.       bestX = distance;
  58.       secondBestX = best[uu.first];
  59.     } else {
  60.       bestX = best[uu.first];
  61.       secondBestX = distance;
  62.     }
  63.     best[uu.first] = bestX;
  64.     secondBest[uu.first] = secondBestX;
  65.     pq.insert(pii(secondBestX, uu.first));
  66.       }
  67.     }
  68.   }
  69.   return secondBest[0];
  70. }
  71.  
  72. void case1(){
  73.   int n = 5;
  74.   int m = 4;
  75.   int k = 3;
  76.   int r[][2] = {
  77.     {0, 1},
  78.     {0, 2},
  79.     {3, 2},
  80.     {2, 4}
  81.   };
  82.   int l[] = {2, 3, 1, 4};
  83.   int p[] = {1, 3, 4};
  84.   printf("%d\n", travel_plan(n, m, r, l, k, p));
  85. }
  86.  
  87. void case2(){
  88.   int n = 5;
  89.   int m = 7;
  90.   int k = 2;
  91.   int r[][2] = {
  92.     {0, 2},
  93.     {0, 3},
  94.     {3, 2},
  95.     {2, 1},
  96.     {0, 1},
  97.     {0, 4},
  98.     {3, 4},
  99.   };
  100.   int l[] = {4, 3, 2, 10, 100, 7, 9};
  101.   int p[] = {1, 3};
  102.   printf("%d\n", travel_plan(n, m, r, l, k, p));
  103. }
  104.  
  105. int main(){
  106.   case1();
  107.   case2();
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement