• 注册
当前位置:1313e > 默认分类 >正文

CF1105E Helping Hiasat 最大团

传送门


发现自己不会求最大团了可海星

如果将每一个朋友看做点,将两个\(1\)之间存在\(2\)操作的所有朋友之间互相连边,那么我们最后要求的就是这个图的最大独立集。

某个图的最大独立集就是反图的最大团

然后暴力dfs求最大团即可


#include
#include
#include
//This code is written by Itst
using namespace std;inline int read(){int a = 0;char c = getchar();bool f = 0;while(!isdigit(c) && c != EOF){if(c == '-')f = 1;c = getchar();}if(c == EOF)exit(0);while(isdigit(c)){a = a * 10 + c - 48;c = getchar();}return f ? -a : a;
}bitset < 41 > Edge[41] , cur , choose;
string mod[41] , s;
int N , M , cnt , maxN;inline int find(){for(int i = 1 ; i <= cnt ; ++i)if(mod[i] == s)return i;mod[++cnt] = s;return cnt;
}void dfs(int x){if(choose.count() + x <= maxN)return;if(!x){maxN = choose.count();return;}if((Edge[x] & choose) == choose){choose.set(x);dfs(x - 1);choose.reset(x);}dfs(x - 1);
}int main(){
#ifndef ONLINE_JUDGEfreopen("in","r",stdin);//freopen("out","w",stdout);
#endifN = read();M = read();for(int i = 1 ; i <= M ; ++i)Edge[i].set();for(int i = 1 ; i <= N ; ++i)if(read() == 1)cur.reset();else{cin >> s;int t = find();if(!cur[t]){for(int i = 1 ; i <= cnt ; ++i)if(cur[i])Edge[i][t] = Edge[t][i] = 0;cur.set(t);}}dfs(M);cout << maxN;return 0;
}

转载于:https://www.cnblogs.com/Itst/p/10320708.html

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录