#include <set> #include <algorithm> #include <stdio.h> using namespace std; #define MAXN 128 int cnt,n,m; set<int> N[MAXN+1]; void BK(set<int> R, set<int> P, set<int> X) { if(cnt>1000) return; if(P.empty()&&X.empty()) { ++cnt; return; } if(P.empty()) return; set<int> ::iterator p=P.begin(); int u=*p; set<int> P_N; set_difference (P.begin(),P.end(),N[u].begin(),N[u].end(),inserter(P_N,P_N.begin())); for(set<int>::iterator i=P_N.begin(); i!=P_N.end(); ++i) { set<int> RR(R),PP,XX; RR.insert(*i); set_intersection(P.begin(),P.end(),N[*i].begin(),N[*i].end(),inserter(PP,PP.begin())); set_intersection(X.begin(),X.end(),N[*i].begin(),N[*i].end(),inserter(XX,XX.begin())); BK(RR,PP,XX); P.erase(P.find(*i)); X.insert(*i); } } int main() { int a,b; while(scanf("%d%d",&n,&m)==2) { cnt=0; for(int i=0; i<m; ++i) { scanf("%d%d",&a,&b); N[a].insert(b); N[b].insert(a); } set<int> R,P,X; for(int i=1; i<n+1; ++i) P.insert(i); BK(R,P,X); if(cnt<=1000) printf("%d/n",cnt); else printf("Too many maximal sets of friends./n"); } return 0; }
http://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm
参考维基百科上的伪代码写的,本来是想用着这过pku2989的,可是这个大材小用了,所以超时了。主要是没有动规吧。可以稍微修改一下,就可以实现输出所有极大团。
set自己没有成员函数,要用algorithm里的。学习了。