Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2020
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define pb push_back
  6. #define S second
  7. #define F first
  8. #define f(i,n) for(int i=1;i<=n;i++)
  9. #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  10. #define vi vector<int>
  11. #define pii pair<int,int>
  12.  
  13. const int N = 305;
  14. const int inf = 1e12;
  15. const int mx = 1000;
  16.  
  17. vector<int> g[N];
  18. bool locate[N][N];
  19. int dis[N][N];
  20. vector<vector<int> > recipe[N];
  21. int dp[N][N];
  22.  
  23. int n,m,s,r;
  24.  
  25. //city i,stone j
  26.  
  27. int go(int i,int j)
  28. {
  29. int & res = dp[i][j];
  30.  
  31. if(res != -1) return res;
  32.  
  33. res = inf;
  34.  
  35. if(locate[i][j] == 1) return res = 0;
  36.  
  37. f(l,n)
  38. if(l != i) res = min(res,go(l,j) + dis[l][i]);
  39.  
  40. for(auto vv : recipe[j])
  41. {
  42. int temp = 0;
  43.  
  44. for(auto v : vv)
  45. {
  46. int temp2 = inf;
  47.  
  48. f(l,n) temp2 = min(temp2,go(l,v) + dis[i][l]);
  49.  
  50. temp+=temp2;
  51.  
  52. }
  53.  
  54. res = min(res,temp);
  55. }
  56.  
  57. return res;
  58. }
  59.  
  60. void solve()
  61. {
  62. cin >> n >> m >> s >> r;
  63.  
  64. int u,v;
  65.  
  66. while(m--)
  67. {
  68. cin >> u >> v;
  69. g[u].pb(v);
  70. g[v].pb(u);
  71. }
  72.  
  73. //calculate distance
  74.  
  75. f(i,n)
  76. {
  77. f(j,n) dis[i][j] = mx;
  78.  
  79. vector<bool> vis(n,0);
  80.  
  81. vis[i] = 1;
  82. dis[i][i] = 0;
  83.  
  84. queue<int> q;
  85. q.push(i);
  86.  
  87. while(!q.empty())
  88. {
  89. auto x = q.front(); q.pop();
  90.  
  91. for(auto v : g[x])
  92. if(!vis[v])
  93. {
  94. vis[v] = 1;
  95. q.push(v);
  96. dis[i][v] = dis[i][x] + 1;
  97. }
  98.  
  99. }
  100. }
  101.  
  102. f(i,n)
  103. {
  104. cin >> u;
  105.  
  106. f(j,u)
  107. {
  108. cin >> v;
  109. locate[i][v] = 1;
  110. }
  111. }
  112.  
  113. f(i,r)
  114. {
  115. vi go;
  116.  
  117. cin >> u;
  118.  
  119. f(j,u)
  120. {
  121. cin >> v;
  122. go.pb(v);
  123. }
  124.  
  125. cin >> v;
  126.  
  127. recipe[v].push_back(go);
  128. }
  129.  
  130. f(i,n) f(j,s) dp[i][j] = -1;
  131.  
  132. int res = inf;
  133.  
  134. f(i,n) res = min(res,go(i,1));
  135.  
  136. if(res >= 1e12) res = -1;
  137.  
  138. cout << res << '\n';
  139.  
  140. for(int i=0;i<N;i++)
  141. {
  142. g[i].clear();
  143. for(int j=0;j<N;j++) locate[i][j] = 0;
  144. recipe[i].clear();
  145. }
  146. }
  147.  
  148. signed main()
  149. {
  150. fast;
  151.  
  152. int t = 1;
  153.  
  154. cin >> t;
  155.  
  156. for(int i=1;i<=t;i++)
  157. {
  158. cout <<"Case #" << i <<": ";
  159. solve();
  160. }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement