当前位置: 首页 > news >正文

最大团优化

貌似咕了三个半月了(gym101915里一道),今天又遇到一道(cf1105E),就学了学惹。

最大团定义:图上取尽可能多的点,这些点构成一个完全图。

最大独立集:图上取尽可能多的点,任意两点间不连接。

可以看出来   一个图的最大团==它的补图的最大独立集 叭

那么我们可以搜索哇!(我不会搜索哇)

一个最朴素的搜索思想:  维护几个点集,当前已选择的,可以选择的,然后每次从可选择的点集里选一个与当前已选择的点都有边的点加进来,然后更新可选择的点集。

这个复杂度就比较恐怖哇

简单的优化:对点排序,每次都选一个节点编号比当前点编号大的。可以参考一下wannafly winter camp 的小木棍那题

剪枝一:如果当然已选点集大小+可选点集大小小于mx,return

剪枝二:我们从后向前选取点,保存后面的答案,如果当前点集+ans[待选]小于mx,return

其他的优化我也没看懂啊。。。

附 1105 E的代码,我真是自闭了。我傻逼了 map.count(s)和 mp[s] 是不一样的、、、调了半个多小时没看出来。。注释掉的部分是输出答案找bug的o.o

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 map<string,int> mp;
 4 int n,m,op;string s;int cnt=-1;
 5 vector<int> v;
 6 bool g[50][50];
 7 int ans;int mx[50];int alt[50][50];
 8 //int cs[50];
 9 bool DFS(int cur, int tot) {
10     if(cur==0) {
11         if(tot>ans) {
12             ans=tot;
13             //for(int i=0;i<tot;i++){
14             //    cout<<cs[i]<<' ';
15             //}
16             //cout<<endl;
17             return 1;
18         }
19         return 0;
20     }
21     for(int i=0; i<cur; i++) {
22         if(cur-i+tot<=ans) return 0;
23         int u=alt[tot][i];
24         if(mx[u]+tot<=ans) return 0;
25         int nxt=0;//cs[tot]=u;
26         for(int j=i+1; j<cur; j++)
27             if(g[u][alt[tot][j]])
28                 alt[tot+1][nxt++]=alt[tot][j];
29         if(DFS(nxt, tot+1)) return 1;
30     }
31     return 0;
32 }
33 int MaxClique() {
34     for(int i=cnt;i>=0; i--) {
35         //cs[0]=i;
36         int cur=0;
37         for(int j=i+1; j<=cnt; j++)
38             if(g[i][j])
39                 alt[1][cur++]=j;
40         DFS(cur, 1);
41         mx[i]=ans;
42     }
43     return ans;
44 }
45 int main(){
46     ios::sync_with_stdio(false);
47     memset(g,1, sizeof(g));
48     cin>>n>>m;
49     for(int i=1;i<=n;i++){
50         cin>>op;
51         if(op==1) v.clear();
52         else{
53             cin>>s;
54             if(!mp.count(s))mp[s]=++cnt;
55             int tmp = mp[s];
56             for(auto q:v)
57                 g[tmp][q]=g[q][tmp]=false;
58             v.push_back(tmp);
59         }
60     }
61     cout<<MaxClique()<<endl;
62 }
View Code

 

转载于:https://www.cnblogs.com/MXang/p/10354144.html

相关文章:

  • 02-jQuery的选择器
  • Aria2 使用手札(简易部署 + 快速进阶)
  • 『The Captain 最短路建图优化』
  • 各种编码格式转换
  • Kali学习笔记40:SQL手工注入(2)
  • Ocelot 资源汇总
  • SSH端口号修改并进行远程访问
  • scrapy爬取知乎某个问题下的所有图片
  • string.intern
  • Servlet 知识点汇总
  • C# 函数1 (函数的定义)
  • XSS 漏洞介绍
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • 端性能优化方法
  • JAVA之Break Continue 浅析
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Akka系列(七):Actor持久化之Akka persistence
  • dva中组件的懒加载
  • Golang-长连接-状态推送
  • IOS评论框不贴底(ios12新bug)
  • Java比较器对数组,集合排序
  • node-glob通配符
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue2.x学习三:事件处理生命周期钩子
  • Vue组件定义
  • webpack+react项目初体验——记录我的webpack环境配置
  • 大快搜索数据爬虫技术实例安装教学篇
  • 悄悄地说一个bug
  • 携程小程序初体验
  • 云大使推广中的常见热门问题
  • raise 与 raise ... from 的区别
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #define
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (1)SpringCloud 整合Python
  • (27)4.8 习题课
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计大学生兼职系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • .Net 6.0 处理跨域的方式
  • .NET MVC第三章、三种传值方式
  • .NET分布式缓存Memcached从入门到实战
  • .net连接oracle数据库
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android] Implementation vs API dependency
  • [Angular 基础] - 指令(directives)
  • [C++]18:set和map的使用
  • [C++]命名空间等——喵喵要吃C嘎嘎