Guest User

Untitled

a guest
Sep 9th, 2021
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include "testlib.h"
  2. //#include "jngen.h"
  3. #include <bits/stdc++.h>
  4.  
  5. #define forn(i, n) for (int i = 0; i < int(n); i++)
  6.  
  7. using namespace std;
  8.  
  9. const int INF = 1e9;
  10.  
  11. vector<int> p;
  12. vector<vector<char>> g;
  13. vector<pair<int, int>> edges;
  14.  
  15. vector<char> used, sv;
  16.  
  17. int getp(int a){
  18.     return a == p[a] ? a : p[a] = getp(p[a]);
  19. }
  20.  
  21. bool unite(int a, int b){
  22.     a = getp(a), b = getp(b);
  23.     if (a == b) return false;
  24.     p[b] = a;
  25.     return true;
  26. }
  27.  
  28. int calc(int n){
  29.     iota(p.begin(), p.end(), 0);
  30.     int cnt = n;
  31.     g.assign(n, vector<char>(n, 0));
  32.     forn(i, edges.size()) if (used[i]){
  33.         int v = edges[i].first, u = edges[i].second;
  34.         g[v][u] = g[u][v] = 1;
  35.         cnt -= unite(v, u);
  36.     }
  37.     if (cnt != 1) return INF;
  38.     vector<vector<int>> dp(1 << n, vector<int>(n));
  39.     forn(s, n) dp[1 << s][s] = 1;
  40.     forn(mask, 1 << n){
  41.         forn(v, n) if (dp[mask][v]){
  42.             forn(u, n) if (!((mask >> u) & 1) && g[v][u]){
  43.                 dp[mask | (1 << u)][u] = min(INF, dp[mask | (1 << u)][u] + dp[mask][v]);
  44.             }
  45.         }
  46.     }
  47.     int tot = 0;
  48.     forn(i, n) tot = min(INF, tot + dp[(1 << n) - 1][i]);
  49.     return tot;
  50. }
  51.  
  52. void dump(int n, int m, int k, int val){
  53.     string name = "tests/" + to_string(val) + "_" + to_string(rnd.next(INF)) + ".in";
  54.     freopen(name.c_str(), "w", stdout);
  55.     printf("%d %d %d\n", n, m, k);
  56.     forn(i, edges.size()) if (sv[i]){
  57.         int v = edges[i].first, u = edges[i].second;
  58.         if (rnd.next(2)) swap(v, u);
  59.         printf("%d %d\n", v + 1, u + 1);
  60.     }
  61.     puts("");
  62.     fclose(stdout);
  63. }
  64.  
  65. int main(int argc, char* argv[]) {
  66.     registerGen(argc, argv, 1);
  67.     int n = atoi(argv[1]);
  68.     int m = atoi(argv[2]);
  69.     int k = atoi(argv[3]);
  70.     double t0 = atof(argv[4]);
  71.     double chg = atof(argv[5]);
  72.    
  73.     forn(i, n) forn(j, i) edges.push_back({i, j});
  74.     shuffle(edges.begin(), edges.end());
  75.     p.resize(n);
  76.    
  77.     used.assign(edges.size(), 0);
  78.     forn(i, m) used[i] = 1;
  79.     sv = used;
  80.     int ans = calc(n);
  81.     int ans_iter = 0;
  82.    
  83.     int iter = 0;
  84.     while (ans > 0){
  85.         ++iter;
  86.         double temp = t0;
  87.         used = sv;
  88.         int cur = calc(n);
  89.         while (temp / t0 >= 1.0 / edges.size()){
  90.             vector<char> was = used;
  91.             vector<vector<int>> p(2);
  92.             forn(i, edges.size())
  93.                 p[used[i]].push_back(i);
  94.             forn(i, 2)
  95.                 shuffle(p[i].begin(), p[i].end());
  96.             for (int it = 0; it < min(p[0].size(), p[1].size()) * temp / t0 && it < int(min(p[0].size(), p[1].size())); it++)
  97.                 swap(p[0][it], p[1][it]);
  98.             forn(i, 2) for (int x : p[i])
  99.                 used[x] = i;
  100.             int tmp = calc(n);
  101.             if (ans > tmp || (ans == tmp && ans_iter != iter)){
  102.                 ans = tmp;
  103.                 ans_iter = iter;
  104.                 sv = used;
  105.                 cerr << ans << " " << (temp / t0) << endl;
  106.                 dump(n, m, k, ans);
  107.             }
  108.             if (tmp < cur){
  109.                 cur = tmp;
  110.             }
  111.             else{
  112.                 double t = exp((cur - tmp) / temp);
  113.                 int x = 1 + rand();
  114.                 int y = 1 + rand();
  115.                 x %= y;
  116.                 if (x / (double) y <= t)
  117.                     cur = tmp;
  118.                 else
  119.                     used = was;
  120.             }
  121.             temp *= chg;
  122.         }
  123.     }
  124. }
  125.  
Add Comment
Please, Sign In to add comment