Advertisement
Guest User

Bruno

a guest
Jun 21st, 2014
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #include "Brunolib.h"
  2. #define ull unsigned long long
  3. #define INF 4000000000000000000LL
  4. #include<stdio.h>
  5. static ull w[310][310], w3[310][310];
  6. static int w2[310][310];
  7. static ull P[5][60];
  8. static ull D[321293][2], G[6], cnt[6];
  9. static int par[60][321293], Res[60];
  10. static int n;
  11. static int hc[62][6];
  12. void Do(int a, int b)
  13. {
  14.     int i;
  15.     ull gap = w[a][b];
  16.     while (1){
  17.         if (a == b)break;
  18.         for (i = 0; i < n; i++){
  19.             if (a != i && w2[a][i]&& w3[a][i] + w[i][b] == gap)break;
  20.         }
  21.         gap -= w3[a][i];
  22.         Answer(w2[a][i] - 1);
  23.         a = i;
  24.     }
  25. }
  26. void Bruno(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[], int L, int X[]) {
  27.     n = N;
  28.     int i, j, k, x, y;
  29.     ull t1, t2, t3;
  30.     for (i = 0; i < N; i++){
  31.         for (j = 0; j < N; j++){
  32.             if (i != j)w[i][j] = INF;
  33.             else w[i][j] = 0;
  34.         }
  35.     }
  36.     for (i = 0; i < M; i++){
  37.         if (C[i] != -1){
  38.             w[A[i]][B[i]] = C[i];
  39.         }
  40.         w2[A[i]][B[i]] = i + 1;
  41.         w3[A[i]][B[i]] = C[i];
  42.     }
  43.     for (k = 0; k < N; k++){
  44.         for (i = 0; i < N; i++){
  45.             for (j = 0; j < N; j++){
  46.                 if (w[i][j]>w[i][k] + w[k][j])w[i][j] = w[i][k] + w[k][j];
  47.             }
  48.         }
  49.     }
  50.     for (i = 0; i < K; i++){
  51.         for (j = 0; j < Q; j++){
  52.             t1 = w[S[j]][T[j]];
  53.             t2 = w[S[j]][A[U[i]]];
  54.             t3 = w[B[U[i]]][T[j]];
  55.             if (t2 == INF || t3 == INF)continue;
  56.             if (t2 + t3 >= t1)continue;
  57.             P[i][j] = t1 - t2 - t3;
  58.         }
  59.     }
  60.     hc[1][0]=1;
  61.     for(i=0;i<=Q+1;i++){
  62.         for(j=0;j<=K;j++){
  63.             if(i!=0){
  64.                 hc[i][j]+=hc[i-1][j];
  65.             }
  66.             if(j!=0){
  67.                 hc[i][j]+=hc[i][j-1];
  68.             }
  69.         }
  70.     }
  71.     j=1;
  72.     for(i=0;i<L;i++){
  73.         j*=2;
  74.         j+=X[L-1-i];
  75.     }
  76.     j=hc[Q+1][K]-j+1;
  77.     G[0] = 1;
  78.     int l=Q;
  79.     for (i = 0; i < K; i++){
  80.         for(k=0;k<=Q;k++){
  81.             if(hc[k+1][K-i]>=j)break;
  82.         }
  83.         j-=hc[k][K-i];
  84.         cnt[i]=l-k;
  85.         l=k;
  86.         G[i + 1] = G[i] * (cnt[i] + 1);
  87.     }
  88.     for (i = 0; i < Q; i++){
  89.         for (j = 0; j < G[K]; j++)par[i][j] = -1;
  90.         for (j = G[K] - 1; j >= 0; j--){
  91.             if (j && (!D[j][0] && !D[j][1]))continue;
  92.             for (k = 0; k < K; k++){
  93.                 if (!P[k][i])continue;
  94.                 if ((j % G[k + 1]) / G[k] == cnt[k])continue;
  95.                 t1 = D[j][0];
  96.                 t2 = P[k][i] + D[j][1];
  97.                 t1 += t2 >> 40, t2 &= ((1ll << 40) - 1);
  98.                 if (D[j + G[k]][0] < t1 || (D[j + G[k]][0] == t1&&D[j + G[k]][1] < t2)){
  99.                     D[j + G[k]][0] = t1;
  100.                     D[j + G[k]][1] = t2;
  101.                     par[i][j + G[k]] = k;
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     x = G[K] - 1, y = Q - 1;
  107.     for (i = 0; i < Q; i++)Res[i] = -1;
  108.     while (x){
  109.         if (par[y][x] == -1){
  110.             y--;
  111.             continue;
  112.         }
  113.         Res[y] = par[y][x];
  114.         x -= G[par[y][x]];
  115.         y--;
  116.     }
  117.     for (i = 0; i < Q; i++){
  118.         if (Res[i] == -1){
  119.             Do(S[i], T[i]);
  120.         }
  121.         else{
  122.             Do(S[i], A[U[Res[i]]]);
  123.             Answer(U[Res[i]]);
  124.             Do(B[U[Res[i]]], T[i]);
  125.         }
  126.         Answer(-1);
  127.     }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement