最大团模板

用于求最大团的点数
只要在mp中赋值好n个点对其他所有的点的关系即可


#include<bits/stdc++.h> using namespace std; #define N 60 int n; int mp[N][N]; int ans; int alt[N][N]; int Max[N]; bool dfs(int cur,int tot)//cur是s1集合的个数 { if(0==cur) { if(tot>ans) { ans=tot;return true; } return false; } for(int i=0;i<cur;i++) { if( tot+cur-i<=ans )return false; int u=alt[tot][i]; if( Max[u]+tot<=ans )return false; int next=0; for(int j=i+1;j<cur;j++) if(mp[u][ alt[tot][j] ])alt[tot+1][next++]=alt[tot][j]; if(dfs(next,tot+1)) return 1; } return 0; } int maxclique(void) { ans=0; memset(Max,0,sizeof(Max)); for(int i=n-1;i>=0;i--) { int cur=0; for(int j=i+1;j<n;j++)if(mp[i][j])alt[1][cur++]=j;//1为s1集合 dfs(cur,1); Max[i]=ans; } return ans; } int main() { while(scanf("%d",&n),n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&mp[i][j]); printf("%d ",maxclique()); } return 0; }
原文地址:https://www.cnblogs.com/bxd123/p/10387683.html