Advertisement
Zeinab_Hamdy

Untitled

Jun 27th, 2024
584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define cnl cout << nl;
  5. #define fi first
  6. #define se second
  7. #define pb push_back
  8. #define ll long long
  9. #define ull unsigned ll
  10. #define RV return void
  11. #define sz(x) int(x.size())
  12. #define all(v) v.begin(), v.end()
  13. #define rall(v) v.rbegin(), v.rend()
  14. #define fixed(n) fixed << setprecision(n)
  15. #define cin(v) for(auto&x:v) cin >> x;
  16. #define cout(v) for(auto&x:v) cout << x << " ";
  17. void files(){
  18.     #ifndef ONLINE_JUDGE
  19.        freopen("input.txt", "r", stdin);
  20.        freopen("output.txt", "w", stdout);
  21.     #endif
  22. }
  23.  
  24.  
  25. int n  , m ;
  26. string str , line , num;
  27. vector < int > v;
  28. map < string , int > mp;
  29. vector < vector < int > > adj , dp;
  30. vector < bool > vis;
  31.  
  32.  
  33. void rec2(int node , int par){
  34.     if(vis[node]) return;
  35.     if(sz(adj[node])==0) return;
  36.  
  37.     vis[node]=1;
  38.  
  39.     for(auto& ch : adj[node]) {
  40.         adj[par].pb(ch);
  41.         rec2(ch , par);
  42.     }
  43. }
  44.  
  45.  
  46. int rec(int day , int mask){
  47.     if( !mask) return 0;
  48.  
  49.     int & ret = dp[day][mask];
  50.     if(~ret)
  51.         return ret;
  52.     ret =0;
  53.     for(int i =0 ; i < n ; i++){
  54.         if((mask >> i) & 1){
  55.             bool flag=0;
  56.             for(auto & ch : adj[i]) {
  57.                 if((mask >> ch) & 1) {
  58.                     flag=1;
  59.                     break;
  60.                 }
  61.             }
  62.             if(flag) continue;
  63.  
  64.             ret = max(ret , day * v[i] + rec(day+1 , mask ^ (1 << i)));
  65.         }
  66.     }
  67.     return ret;
  68. }
  69.  
  70. void solve(){
  71.    
  72.  
  73.     cin >> n >> m ;
  74.     v.assign(n,0);
  75.     mp.clear();
  76.     adj.assign(n+1 , vector < int > ());
  77.     cin.ignore();
  78.     dp.assign(n+1 , vector < int > (1<<n , -1));
  79.     for(int i =0 ; i < n ; i++){
  80.         getline(cin, line);
  81.         int idx = sz(line) -1 , id2=0;
  82.         num="" , str="";
  83.  
  84.         while(idx >=0 and line[idx] !=' ') num += line[idx--];
  85.         reverse(all(num));
  86.         for(auto& c : num) v[i] = v[i] * 10 + (c-'0');
  87.  
  88.         while(id2 < idx) str += line[id2++];
  89.         mp[str] = i;
  90.  
  91.         // cout << str << "\n" << v[i] << nl;
  92.     }
  93.  
  94.    for(int i =0 ; i < m ; i++){
  95.        getline(cin ,str);
  96.        auto it = str.find(" --> ");
  97.        string s1 = str.substr(0 , it );
  98.        string s2 = str.substr(it+5);
  99.        adj[mp[s2]].pb(mp[s1]);
  100.    }
  101.  
  102.     for(int i =0 ; i < n ; i++){
  103.         vis.assign(n+1,0);
  104.         vis[i]=1;
  105.         rec2(i , i);
  106.     }
  107.  
  108.     cout << rec(1 , (1 << n) - 1) << nl;
  109.    
  110.  
  111.  
  112. }
  113.  
  114.  
  115.  
  116. int main(){
  117.     ios_base::sync_with_stdio(false);
  118.     cin.tie(nullptr);
  119.     cout.tie(nullptr);
  120.                            
  121.     //  files();
  122.    
  123.    
  124.     int testCase=1;
  125.         cin >> testCase ;
  126.         cin.ignore();
  127.     for(int i=1 ; i <= testCase ; i++){
  128.         solve();
  129.     }
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement