Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define pb push_back
- #define S second
- #define F first
- #define f(i,n) for(int i=1;i<=n;i++)
- #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
- #define vi vector<int>
- #define pii pair<int,int>
- const int N = 305;
- const int inf = 1e12;
- const int mx = 1000;
- vector<int> g[N];
- bool locate[N][N];
- int dis[N][N];
- vector<vector<int> > recipe[N];
- int dp[N][N];
- int n,m,s,r;
- //city i,stone j
- int go(int i,int j)
- {
- int & res = dp[i][j];
- if(res != -1) return res;
- res = inf;
- if(locate[i][j] == 1) return res = 0;
- f(l,n)
- if(l != i) res = min(res,go(l,j) + dis[l][i]);
- for(auto vv : recipe[j])
- {
- int temp = 0;
- for(auto v : vv)
- {
- int temp2 = inf;
- f(l,n) temp2 = min(temp2,go(l,v) + dis[i][l]);
- temp+=temp2;
- }
- res = min(res,temp);
- }
- return res;
- }
- void solve()
- {
- cin >> n >> m >> s >> r;
- int u,v;
- while(m--)
- {
- cin >> u >> v;
- g[u].pb(v);
- g[v].pb(u);
- }
- //calculate distance
- f(i,n)
- {
- f(j,n) dis[i][j] = mx;
- vector<bool> vis(n,0);
- vis[i] = 1;
- dis[i][i] = 0;
- queue<int> q;
- q.push(i);
- while(!q.empty())
- {
- auto x = q.front(); q.pop();
- for(auto v : g[x])
- if(!vis[v])
- {
- vis[v] = 1;
- q.push(v);
- dis[i][v] = dis[i][x] + 1;
- }
- }
- }
- f(i,n)
- {
- cin >> u;
- f(j,u)
- {
- cin >> v;
- locate[i][v] = 1;
- }
- }
- f(i,r)
- {
- vi go;
- cin >> u;
- f(j,u)
- {
- cin >> v;
- go.pb(v);
- }
- cin >> v;
- recipe[v].push_back(go);
- }
- f(i,n) f(j,s) dp[i][j] = -1;
- int res = inf;
- f(i,n) res = min(res,go(i,1));
- if(res >= 1e12) res = -1;
- cout << res << '\n';
- for(int i=0;i<N;i++)
- {
- g[i].clear();
- for(int j=0;j<N;j++) locate[i][j] = 0;
- recipe[i].clear();
- }
- }
- signed main()
- {
- fast;
- int t = 1;
- cin >> t;
- for(int i=1;i<=t;i++)
- {
- cout <<"Case #" << i <<": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement