先上最大团定义:
深搜? dfs(p); visit[p]=1; 1. for(int i=1;i<=n;i++) if(visit[i]==1) dfs(i); 2.然后假设 i这个点就是在大团里面的啦: 如果存在 map[i][k]=0; visit[k]=0; 代表不能选取(回溯时记得标志清理干净) for(int i=1;i<=n;i++) if(visit[i]==1) dfs(i); 最后数visit的1的数目更新答案..... 显然这是暴力算法...不过先写一发,看看有多暴力
代码 #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <map> using namespace std; const int MAXN=60; int N; int Path[MAXN][MAXN]; int Set[MAXN];//用以寻找一个可能集合 int Ans; //判断新点是否与原集合里的点互相连通 bool is_clique( const int end, const int point ) { for( int i=1; i<end; ++i ) { if( !Path[ Set[i] ][point] ) { return false; } } return true; } //递归查找,查找算法简单明了,不再详说 void dfs( int depth, int now ) { if( depth+N-now+1 <= Ans ) { return; } for( int i=now; i<=N; ++i ) { if( is_clique(depth+1, i) ) { Set[depth+1]=i; dfs( depth+1, i+1 ); } } if( depth > Ans ) { Ans=depth; } } int main() { freopen("in","r",stdin); while( scanf("%d", &N)!=EOF && N ) { for( int i=1; i<=N; ++i ) { for( int j=1; j<=N; ++j ) { scanf("%d", &Path[i][j]); } } Ans=0; dfs( 0, 1 ); printf("%d\n", Ans); } return 0; } //还可以设置一个DP[MAXN],用以记录i~N点集合里最大团数,可以利用这一点剪枝. DP[n]=DP[n+1]+1 or DP[n+1];
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <map> using namespace std; const int MAXN=60; int N; int Path[MAXN][MAXN]; int Set[MAXN];//用以寻找一个可能集合 int Ans; int DP[MAXN]; //判断新点是否与原集合里的点互相连通 bool is_clique( const int end, const int point ) { for( int i=1; i<end; ++i ) { if( !Path[ Set[i] ][point] ) { return false; } } return true; } //递归查找,查找算法简单明了,不再详说 void dfs( int depth, int now ) { if( depth+N-now+1 <= Ans||depth+DP[now] <=Ans ) { return; } for( int i=now; i<=N; ++i ) { if( is_clique(depth+1, i) ) { Set[depth+1]=i; dfs( depth+1, i+1 ); } } if( depth > Ans ) { Ans=depth; } } int main() { // freopen("a.in","r",stdin); while( scanf("%d", &N)!=EOF && N ) { for( int i=1; i<=N; ++i ) { for( int j=1; j<=N; ++j ) { scanf("%d", &Path[i][j]); } } memset(DP,0,sizeof(DP)); Ans=0; DP[N]=1; for(int i=N-1;i>=1;i--) { Set[1]=i; dfs( 1, i+1 ); DP[i]=Ans; } printf("%d\n", DP[1]); } return 0; }并没有多大效果...但是还是少了1s 不错了