int n,m; //m为节点个数
int mpp[50][50];
int st[50][50];
int mans=0;
int dp[50]; //dp[i] 表示为i到m的节点中最大团的节点数
map<string,int> mp;
void dfs(int stp,int num){
if(!num){
if(stp>mans){
mans=stp;
}
return;
}
for(int i=0;i<num;++i){
if(stp+n-st[stp][i]-1<=mans) break;
if(stp+dp[st[stp][i]]<=mans) break;
int tmp=0;
for(int j=i+1;j<num;++j){
if(mpp[st[stp][i]][st[stp][j]]){
st[stp+1][tmp++]=st[stp][j];
}
}
dfs(stp+1,tmp);
}
}
void solve(){
int cnt=0;
for(int i=m-1;i>=0;--i){
cnt=0;
for(int j=i+1;j<m;++j){
if(mpp[i][j]){
st[1][cnt++]=j;
}
}
dfs(1,cnt);
dp[i]=mans;
}
}
来源:CSDN
作者:自ran而然
链接:https://blog.csdn.net/S1766434333/article/details/104581708