Advertisement
Guest User

1101 - A Secret Mission

a guest
Apr 29th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.15 KB | None | 0 0
  1. //  Mafi, KUET 2K11
  2.  
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5.  
  6. typedef long long int ll;
  7. typedef unsigned long long ull;
  8.  
  9. #define sc1(n) scanf("%d",&n)
  10. #define sc2(a,b) scanf("%d %d",&a,&b)
  11. #define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c)
  12. #define sl1(n) scanf("%lld",&n)
  13. #define sl2(a,b) scanf("%lld %lld",&a,&b)
  14. #define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
  15. #define mem(v,val) memset(v,val,sizeof v)
  16. #define sz(v) v.size()
  17. #define REVERSE(v) reverse(v.begin(),v.end())
  18. #define all(v) v.begin(),v.end()
  19. #define pb push_back
  20. #define ff first
  21. #define ss second
  22. #define MP make_pair
  23. #define pp pair<int,int>
  24. #define pp1 pair<int,pair<int,int> >
  25. #define pp2 pair<pair<int,int>,int >
  26.  
  27. #define rep(i,n) for(i=1;i<=n;i++)
  28. #define Rep(i,n) for(i=0;i<n;i++)
  29. #define For(i,a,b) for(i=a;i<=b;i++)
  30.  
  31. #define INF INT_MAX
  32. #define MAXN 100006
  33. #define modu 1000000007
  34. #define gcd(a,b) __gcd(a,b)
  35. #define lcm(a,b) (a*b)/gcd(a,b)
  36.  
  37. #define read() freopen("input.txt","r",stdin);
  38. #define write() freopen("output.txt","w",stdout);
  39.  
  40. const double pi=acos(-1.0);
  41.  
  42. //int row[]={1,0,-1,0};int col[]={0,1,0,-1}; //4 Direction
  43. //int row[]={1,1,0,-1,-1,-1,0,1};int col[]={0,1,1,1,0,-1,-1,-1};//8 direction
  44. //int row[]={2,1,-1,-2,-2,-1,1,2};int col[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction
  45.  
  46. ll leap(ll x)
  47. {
  48.     if((x%4==0&&x%100!=0)||x%400==0) return 1;
  49.     return 0;
  50. }
  51.  
  52. ll nCr(ll n, ll r)
  53. {
  54.     if(r==0) return 1;
  55.     else return nCr(n-1,r-1)*n/r;
  56. }
  57.  
  58. ll mod(ll N,ll M)//N%M
  59. {
  60.     ll temp = N/M;
  61.     N-=temp*M;
  62.     return N;
  63. }
  64.  
  65. ll bigmod(ll N,ll M,ll MOD) //(N^M)%MOD
  66. {
  67.     if(M==0) return 1;
  68.     if((M/2)*2==M)
  69.     {
  70.         ll ret = bigmod(N,M/2,MOD);
  71.         return ((ret%MOD)*(ret%MOD))%MOD;
  72.     }
  73.     else return ((N%MOD)*bigmod(N,M-1,MOD)%MOD)%MOD;
  74. }
  75.  
  76. ll modinverse(ll a,ll m)  //a*x=1(mod m)
  77. {
  78.     return bigmod(a,m-2,m);
  79. }
  80.  
  81. struct Euclid
  82. {
  83.     ll x,y,d;
  84.     Euclid() {};
  85.     Euclid(ll xx,ll yy,ll dd)
  86.     {
  87.         x = xx, y = yy, d = dd;
  88.     }
  89. };
  90.  
  91. Euclid Extended_gcd(ll a, ll b)// input a,b Output x,y,d;ax+by = d,d=gcd(a,b)
  92. {
  93.     if(!b)
  94.         return Euclid(1,0,a);
  95.     Euclid e = Extended_gcd(b,a%b);
  96.     return Euclid(e.y,e.x-a/b*e.y,e.d);
  97. }
  98.  
  99. #define count_bit(x)    __builtin_popcountll(x) //number of 1 in binary of x; __builtin_popcount=int,__builtin_popcountl=long int,__builtin_popcountll=long long int
  100. ll Set(ll N,ll pos)
  101. {
  102.     return N|(1LL<<pos);
  103. }
  104. ll reset(ll N,ll pos)
  105. {
  106.     return N&~(1LL<<pos);
  107. }
  108. ll check(ll N,ll pos)
  109. {
  110.     return (N&(1LL<<pos));
  111. }
  112.  
  113. #define mx 50001
  114.  
  115. int p[mx],rank[mx];
  116.  
  117. typedef pair<int,int>ppp;
  118.  
  119. vector<ppp>graph[mx];
  120.  
  121. int level[mx];
  122. int parent[mx][20];
  123. int max_dist[mx][20];
  124. int first_parent[mx];
  125. int dist[mx];
  126.  
  127. bool visit[mx];
  128.  
  129. void bfs(int source)
  130. {
  131.  
  132.     queue <int>q;
  133.  
  134.     q.push(source);
  135.  
  136.     dist[source] = 0;//graph[source][0].second;
  137.  
  138.     first_parent[source] = source;
  139.  
  140.     level[source] = 0;
  141.  
  142.     visit[source] = 1;
  143.  
  144.     while(!q.empty())
  145.     {
  146.         int top = q.front();
  147.  
  148.         q.pop();
  149.  
  150.         for(int i=0; i<graph[top].size(); i++)
  151.         {
  152.             int v = graph[top][i].first;
  153.  
  154.             if(!visit[v])
  155.             {
  156.                 visit[v]=true;
  157.  
  158.                 first_parent[v] = top;
  159.  
  160.                 level[v] = level[top]+1;
  161.  
  162.                 dist[v] = graph[top][i].second;
  163.  
  164.                 q.push(v);
  165.             }
  166.         }
  167.  
  168.     }
  169.  
  170. }
  171.  
  172. void lca_init(int N)
  173. {
  174.     memset(parent,-1,sizeof(parent));
  175.  
  176.     int i,j;
  177.  
  178.     for(i=1; i<=N; i++)
  179.         parent[i][0]=first_parent[i],max_dist[i][0] = dist[i];
  180.  
  181.     for(j=1; (1<<j)<=N; j++)
  182.         for(i=1; i<=N; i++)
  183.             if(parent[i][j-1]!=-1)
  184.                 parent[i][j] = parent[parent[i][j-1]][j-1],max_dist[i][j] = max(max_dist[i][j-1],max_dist[parent[i][j-1]][j-1]);
  185.  
  186. }
  187.  
  188.  
  189.  
  190. int lca_query(int x,int y)
  191. {
  192.     int temp,i;
  193.  
  194.     int log=1;
  195.  
  196.     int maxi=0;
  197.  
  198.     if(level[x]<level[y])
  199.     {
  200.         temp = x;
  201.         x = y;
  202.         y = temp;
  203.     }
  204.  
  205.     while(1)
  206.     {
  207.         int next = log+1;
  208.  
  209.         if((1<<next)>level[x])
  210.             break;
  211.  
  212.         log++;
  213.     }
  214.  
  215.     for(i=log; i>=0; i--)
  216.         if(level[x]-(1<<i)>=level[y])
  217.         {
  218.             maxi = max(maxi,max_dist[x][i]);
  219.             x = parent[x][i];
  220.         }
  221.  
  222.     if(x==y)
  223.         return maxi;
  224.  
  225.     for(i=log; i>=0; i--)
  226.     {
  227.         if(parent[x][i]!=-1&&parent[x][i]!=parent[y][i])
  228.         {
  229.             maxi = max(maxi,max(max_dist[x][i],max_dist[y][i]));
  230.             x = parent[x][i];
  231.             y = parent[y][i];
  232.  
  233.         }
  234.     }
  235.     maxi = max(maxi,max(dist[x],dist[y]));
  236.     return maxi;
  237.  
  238. }
  239.  
  240. struct data_min
  241. {
  242.     int a,b,c;
  243.  
  244.     bool operator<(const data_min &p)const
  245.     {
  246.         return c>p.c;
  247.     }
  248.  
  249. } dt;
  250.  
  251. int Find(int x)
  252. {
  253.     if(x==p[x])
  254.         return x;
  255.  
  256.     else
  257.         return p[x] = Find(p[x]);
  258. }
  259.  
  260. int Union(int a,int b)
  261. {
  262.     if(rank[a]<rank[b])
  263.  
  264.         p[a] = Find(b);
  265.  
  266.     else
  267.     {
  268.         p[b] = Find(a);
  269.  
  270.         if(rank[a] ==rank[b])
  271.  
  272.             rank[a]++;
  273.     }
  274. }
  275.  
  276. int main()
  277. {
  278.     int test,t,i;
  279.  
  280.     int node,edge;
  281.  
  282.     sc1(test);
  283.  
  284.     rep(t,test)
  285.     {
  286.  
  287.         sc2(node,edge);
  288.  
  289.         priority_queue<data_min>pq;
  290.  
  291.         int start,end,cost;
  292.  
  293.         rep(i,edge)
  294.         {
  295.             sc3(start,end,cost);
  296.  
  297.             dt.a = start;
  298.  
  299.             dt.b = end;
  300.  
  301.             dt.c = cost;
  302.  
  303.             p[start] = start;
  304.  
  305.             p[end] = end;
  306.  
  307.             rank[start] = 0;
  308.  
  309.             rank[end] = 0;
  310.  
  311.             pq.push(dt);
  312.  
  313.         }
  314.  
  315.         int total_cost = 0,cnt = 0;
  316.  
  317.         while(!pq.empty())
  318.         {
  319.  
  320.             if(cnt == node-1)
  321.                 break;
  322.  
  323.             int x,y,z;
  324.  
  325.             x = pq.top().a;
  326.  
  327.             y = pq.top().b;
  328.  
  329.             z = pq.top().c;
  330.  
  331.             int PA = Find(x);
  332.  
  333.             int PB = Find(y);
  334.  
  335.             if(PA!=PB)
  336.             {
  337.                 cnt++;
  338.  
  339.                 total_cost+=z;
  340.  
  341.                 Union(PA,PB);
  342.  
  343.                 graph[x].pb(ppp(make_pair(y,z)));
  344.  
  345.                 graph[y].pb(ppp(make_pair(x,z)));
  346.  
  347.             }
  348.  
  349.             pq.pop();
  350.  
  351.         }
  352.  
  353.         while(!pq.empty())
  354.             pq.pop();
  355.  
  356.         memset(visit,false,sizeof visit);
  357.  
  358.         bfs(1);
  359.  
  360.         lca_init(node);
  361.  
  362.         /*cout<<endl;
  363.         cout<<endl;
  364.         for(int i=1; i<=node; i++)
  365.             for(int j=0; j<graph[i].size(); j++)
  366.                 cout<<i<<" "<<graph[i][j].first<<" "<<graph[i][j].second<<endl;
  367.         for(int i=1; i<=node; i++)
  368.             cout<<dist[i]<<ends;
  369.         cout<<endl;
  370.         cout<<endl;*/
  371.  
  372.         int query;
  373.  
  374.         sc1(query);
  375.  
  376.         printf("Case %d:\n",t);
  377.  
  378.         while(query--)
  379.         {
  380.             sc2(start,end);
  381.  
  382.             if(start>end)
  383.             {
  384.                 int temp = start;
  385.                 start = end;
  386.                 end = temp;
  387.             }
  388.  
  389.             printf("%d\n",lca_query(start,end));
  390.         }
  391.  
  392.         for(int i=0; i<=node; i++)
  393.             graph[i].clear();
  394.     }
  395.  
  396.     return 0;
  397.  
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement