Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.45 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FRE(i,a,b) for(i = a; i <= b; i++)
  5. #define FRL(i,a,b) for(i = a; i < b; i++)
  6. #define mem(t, v) memset ((t) , v, sizeof(t))
  7. #define all(x) x.begin(),x.end()
  8. #define un(x) x.erase(unique(all(x)), x.end())
  9. #define sf(n) scanf("%d", &n)
  10. #define sff(a,b) scanf("%d %d", &a, &b)
  11. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  12. #define sl(n) scanf("%lld", &n)
  13. #define sll(a,b) scanf("%lld %lld", &a, &b)
  14. #define slll(a,b,c) scanf("%lld %lld %lld", &a, &b, &c)
  15. #define D(x) cerr << #x " = " << (x) << '\n'
  16. #define DBG cerr << "Hi" << '\n'
  17. #define pb push_back
  18. #define PI acos(-1.00)
  19. #define xx first
  20. #define yy second
  21. #define eps 1e-9
  22.  
  23. typedef unsigned long long int ULL;
  24. typedef long long int LL;
  25. typedef pair<int,int> pii;
  26. typedef pair<LL,LL> pll;
  27.  
  28.  
  29. inline int setBit(int N, int pos) { return N=N | (1<<pos); }
  30. inline int resetBit(int N, int pos) { return N= N & ~(1<<pos); }
  31. inline bool checkBit(int N, int pos) { return (bool)(N & (1<<pos)); }
  32.  
  33. //int fx[] = {+0, +0, +1, -1, -1, +1, -1, +1};
  34. //int fy[] = {-1, +1, +0, +0, +1, +1, -1, -1}; //Four & Eight Direction
  35.  
  36. #define MAX 100000
  37. const LL inf = 1e15;
  38. int n;
  39. vector<pii>E[MAX+10];
  40. struct data{
  41. LL u, c;
  42. };
  43.  
  44. bool operator <(data a, data b)
  45. {
  46. return a.c > b.c;
  47. }
  48. priority_queue<data>Q;
  49. LL dist[MAX+10];
  50. void dijkstra(int src)
  51. {
  52. for(int i = 1; i<=n; i++)
  53. dist[i] = inf;
  54. dist[src] = 0;
  55. Q.push({src,0});
  56. while(!Q.empty())
  57. {
  58. int u = Q.top().u;
  59. Q.pop();
  60. for(int i = 0; i<E[u].size(); i++)
  61. {
  62. int v = E[u][i].xx;
  63. LL w = E[u][i].yy;
  64. if(dist[u]+w < dist[v])
  65. {
  66. dist[v] = dist[u]+w;
  67. Q.push({v,dist[v]});
  68. }
  69. }
  70. }
  71. }
  72.  
  73. //1-Based directed graph input
  74. vector<int> g[MAX+5],tree[MAX+5],rg[MAX+5],bucket[MAX+5];
  75. int sdom[MAX+5],par[MAX+5],dom[MAX+5],dsu[MAX+5],label[MAX+5];
  76. int arr[MAX+5],rev[MAX+5],T, source;
  77. void init(int _n, int _source)
  78. {
  79. T = 0;
  80. n = _n;
  81. source = _source;
  82. for(int i = 1; i<=n; i++)
  83. {
  84. g[i].clear(), rg[i].clear(), tree[i].clear(), bucket[i].clear();
  85. arr[i] = sdom[i] = par[i] = dom[i] = dsu[i] = label[i] = rev[i] = 0;
  86. }
  87. }
  88. void dfs(int u)
  89. {
  90. T++;
  91. arr[u]=T;
  92. rev[T]=u;
  93. label[T]=T;
  94. sdom[T]=T;
  95. dsu[T]=T;
  96. for(int i=0; i<g[u].size(); i++)
  97. {
  98. int w = g[u][i];
  99. if(!arr[w])
  100. {
  101. dfs(w);
  102. par[arr[w]]=arr[u];
  103. }
  104. rg[arr[w]].push_back(arr[u]);
  105. }
  106. }
  107.  
  108. int Find(int u,int x = 0)
  109. {
  110. if(u==dsu[u])return x?-1:u;
  111. int v = Find(dsu[u],x+1);
  112. if(v<0)return u;
  113. if(sdom[label[dsu[u]]]<sdom[label[u]])
  114. label[u] = label[dsu[u]];
  115. dsu[u] = v;
  116. return x?v:label[u];
  117. }
  118. void Union(int u,int v) //Add an edge u-->v
  119. {
  120. dsu[v]=u;
  121. }
  122.  
  123. void build()
  124. {
  125. dfs(source);
  126. for(int i=n; i>=1; i--)
  127. {
  128. for(int j=0; j<rg[i].size(); j++)
  129. sdom[i] = min(sdom[i],sdom[Find(rg[i][j])]);
  130. if(i>1)bucket[sdom[i]].push_back(i);
  131. for(int j=0; j<bucket[i].size(); j++)
  132. {
  133. int w = bucket[i][j],v = Find(w);
  134. if(sdom[v]==sdom[w]) dom[w]=sdom[w];
  135. else dom[w] = v;
  136. }
  137. if(i>1)Union(par[i],i);
  138. }
  139.  
  140. for(int i=2; i<=n; i++)
  141. {
  142. if(dom[i]!=sdom[i])dom[i]=dom[dom[i]];
  143. // tree[rev[i]].push_back(rev[dom[i]]);
  144. tree[rev[dom[i]]].push_back(rev[i]);
  145. }
  146. }
  147.  
  148. int deg[MAX+10], weight[MAX+10];
  149. LL ans[MAX+10];
  150. int dfs2(int node)
  151. {
  152. int ret = 1;
  153. for(int i = 0; i<tree[node].size(); i++)
  154. {
  155. int v = tree[node][i];
  156. int nw = dfs2(v);
  157. if(deg[v] == 1)
  158. ans[nw] = min(ans[nw], (LL)weight[v]);
  159. ret += nw;
  160. }
  161. return ret;
  162. }
  163.  
  164. int main()
  165. {
  166. freopen("in2.txt","r",stdin);
  167. freopen("outta2.txt","w",stdout);
  168. int i, j, cs, t, u, v, w, m, q;
  169. sf(t);
  170. FRE(cs,1,t)
  171. {
  172. mem(deg,0);
  173. sff(n,m);
  174. FRE(i,1,m)
  175. {
  176. sfff(u,v,w);
  177. E[u].pb({v,w});
  178. E[v].pb({u,w});
  179. }
  180. dijkstra(1);
  181. FRE(i,0,n)
  182. ans[i] = inf;
  183. init(n,1);
  184. for(int u = 1; u<=n; u++)
  185. {
  186. for(int j = 0; j<E[u].size(); j++)
  187. {
  188. int v = E[u][j].xx;
  189. int w = E[u][j].yy;
  190. if(dist[v] == dist[u] + w)
  191. weight[v] = w, g[u].pb(v),deg[v]++;
  192. }
  193. }
  194.  
  195. for(int u = 1; u<=n; u++)
  196. {
  197. for(int j = 0; j<E[u].size(); j++)
  198. {
  199. int v = E[u][j].xx;
  200. int w = E[u][j].yy;
  201. if(!(dist[v] == dist[u] + w && deg[v] == 1))
  202. {
  203. swap(u,v);
  204. if(!(dist[v] == dist[u] + w && deg[v] == 1))
  205. ans[0] = min(ans[0], (LL)w);
  206. swap(u,v);
  207. }
  208. }
  209. }
  210.  
  211. build();
  212. dfs2(1);
  213. sf(q);
  214. printf("Case %d:\n",cs);
  215. while(q--)
  216. {
  217. sf(u);
  218. if(ans[u] == inf)
  219. ans[u] = -1;
  220. printf("%d\n",ans[u]);
  221. }
  222. FRE(i,1,n)
  223. E[i].clear();
  224. }
  225. return 0;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement