int main(int argc, char **argv) {
  // Set up signal handling
  struct sigaction sa;
  sa.sa_handler = signal_handler;
  sa.sa_flags = SA_RESTART;
  sigemptyset(&sa.sa_mask);
  sigaddset(&sa.sa_mask, SIGTERM);
  sigaction(SIGTERM, &sa, NULL);

  int opt;
  while ((opt = getopt(argc, argv, "fds:")) != -1) {
    if (opt == 's') {
      srand(unsigned(std::stoul(optarg)));
    } else {
      std::cerr << "Invalid argument: " << opt << ", aborting\n";
      return 1;
    }
  }

  Graph graph;

  if (optind == argc - 1) {
    std::ifstream graph_input(argv[argc - 1]);
    graph = Graph(graph_input);
  } else {
    graph = Graph(std::cin);
  }

  TD td = minimum_degree_heuristic(graph);
  validate_td(graph, td);

  *tmp_str = td.to_string(graph);
  tmp_str = best_td_str.exchange(tmp_str);
  best_width = td.width();
  std::cout << "c status " << td.width() << " "
            << std::chrono::duration_cast<std::chrono::milliseconds>(
                   std::chrono::system_clock::now().time_since_epoch()).count()
            << "\n";

  while (true) {
    td = minimum_fillin_heuristic(graph, best_width.load());
    validate_td(graph, td);
    if (td.width() < best_width.load()) {
      *tmp_str = td.to_string(graph);
      tmp_str = best_td_str.exchange(tmp_str);
      best_width = td.width();
      std::cout << "c status " << td.width() << " "
                << std::chrono::duration_cast<std::chrono::milliseconds>(
                       std::chrono::system_clock::now().time_since_epoch())
                       .count() << "\n";
    }
  }
}
Пример #2
0
int main(void)
{
     int **graph_a = NULL;  //指向a图
     int **graph_b = NULL;  //指向b图
     int *ga_degree = NULL; //指向"存储a图的度的数组"
     int *gb_degree = NULL; //指向"存储b图的度的数组"
     int va_num = 0;        //a图的顶点个数
     int vb_num = 0;        //b图的顶点个数
     int ea_num = 0;        //a图的边数
     int eb_num = 0;        //b图的边数
     int ga_rand = 0;       //a图的秩
     int gb_rand = 0;       //b图的秩
     int i = 0;


     printf("-----本程序判断两个无向图是否同构-----\n");

     printf("请输入第一个图的顶点数: ");
     scanf("%d", &va_num);

     printf("请输入第二个图的顶点数: ");
     scanf("%d", &vb_num);

     if (va_num != vb_num)
     {
          printf("不同构! 顶点数不相等!\n");
          return 0;
     }
/*
     ////////////////////////试试放在函数里//////////////
     //分配内存
     //第一个图
     graph_a = (int **)malloc(va_num * sizeof(int *));
     for (i = 0; i < va_num; i++)
     {
          graph_a[i] = (int *) malloc(va_num * sizeof(int));
     }

     //第一个图的度
     ga_degree = (int *)malloc(va_num * sizeof(int));

     //分配第二个图
     graph_b = (int **)malloc(vb_num * sizeof(int *));
     for (i = 0; i < vb_num; i++)
     {
          graph_b[i] = (int *) malloc(vb_num * sizeof(int));
     }

     //第二图的度
     gb_degree = (int *) malloc(vb_num *sizeof(int));

*/
     graph_a = graph_malloc(va_num);
     ga_degree = degree_malloc(va_num);
     graph_b = graph_malloc(vb_num);
     gb_degree = degree_malloc(vb_num);

     //输入数据(邻接矩阵) & 检查是否输入有误
     printf("输入第一个图的邻接矩阵:\n");
     ea_num = graph_input(graph_a, va_num);

     printf("输入第二个图的邻接矩阵:\n");
     eb_num = graph_input(graph_b, vb_num);

     //判断边数是否相等
     if(ea_num != eb_num)
     {
         printf("不同构! 边数不相等!\n");
         return 0;
     }

     //求两图每个点的度, 排序后判断每个顶点的度
     //ga_degree 是值-结果参数
     graph_degree(graph_a, ga_degree, va_num);
     graph_degree(graph_b, gb_degree, vb_num);

     //判断
     for (i = 0; i < va_num; i++)
     {
         if (ga_degree[i] != gb_degree[i])
         {
             printf("不同构! 各个顶点的度不对应!\n");
             return 0;
         }
     }



     //求矩阵的秩
     ga_rand = graph_rand(graph_a, va_num);
     gb_rand = graph_rand(graph_b, vb_num);

     //判断矩阵的4是否相等
     if (ga_rand != gb_rand)
     {
//         printf("%d %d\n", ga_rand, gb_rand);
         printf("不同构! 秩不相等!\n");
     }
     else
     {
          printf("同构!\n");
     }

/*
     //释放内存
     for (i = 0; i < va_num; i++)
     {
          free(graph_a[i]);
     }
     free(graph_a);
     free(ga_degree);

     for (i = 0; i < vb_num; i++)
     {
         free(graph_b[i]);
     }
     free(graph_b);
     free(gb_degree);
*/
     graph_free(graph_a, ga_degree, va_num);
     graph_free(graph_b, gb_degree, vb_num);
     
     return 0;


}