s:我手中有PDF版的该算法的原版文章,有兴趣的给我发message。ZJU1002和ZJU1654本质上属于这类问题,但是由于那种矩阵转化为邻接表比较麻烦,所以不推荐用该解法。</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 仿宋_GB2312; mso-bidi-font-family: 仿宋_GB2312; mso-ansi-language: ZH-CN;"><font face="Times New Roman"></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 仿宋_GB2312; mso-bidi-font-family: 仿宋_GB2312; mso-ansi-language: ZH-CN;"><font face="Times New Roman">求解浙江大学ACM1492源程序(最大团算法)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 仿宋_GB2312; mso-bidi-font-family: 仿宋_GB2312; mso-ansi-language: ZH-CN;"><font face="Times New Roman">//n年前写的,有点乱 <br/> <br/> #include<iostream> <br/> #include<cstdio> <br/> #include<cstring> <br/> using namespace std; <br/> const int N=50; <br/> int mat[N][N]; <br/> int max; <br/> int c[N]; <br/> int found; <br/> struct vset{ <br/> long highbit,lowbit; <br/> void setone(int k); <br/> }; <br/> void vset::setone(int k) <br/> { <br/> if(k<25) <br/> { <br/> lowbit=lowbit|(1<<k); <br/> } <br/> else <br/> { <br/> highbit=highbit|(1<<(k-25)); <br/> } <br/> } <br/> vset num[N]; <br/> void input(int n) <br/> { <br/> int i,j; <br/> memset(num,0,sizeof(num)); <br/> for(i=0;i<n;i++) <br/> for(j=0;j<n;j++) <br/> { <br/> cin>>mat[j]; <br/> if(mat[j] && j!=i) <br/> { <br/> num.setone(j); <br/> num[j].setone(i); <br/> } <br/> } <br/> } <br/> <br/> <br/> <br/> int length(long b) <br/> { <br/> int temp; <br/> int res=0; <br/> int i; <br/> for(i=0;i<25;i++) <br/> { <br/> temp=1<<i; <br/> if(temp&b) <br/> res++; <br/> } <br/> return res; <br/> } <br/> int vset_size(vset a) <br/> { <br/> return a.highbit+a.lowbit; <br/> } <br/> vset s_vset(int k,int n) <br/> { <br/> int i; <br/> vset r; <br/> r.highbit=0; <br/> r.lowbit=0; <br/> for(i=n-1;i>=k;i--) <br/> r.setone(i); <br/> return r; <br/> <br/> } <br/> <br/> int minbit(vset a) <br/> { <br/> int res=0; <br/> long b=a.lowbit; <br/> long temp; <br/> int i; <br/> if(!b) <br/> { <br/> res=25; <br/> b=a.highbit; <br/> } <br/> for(i=0;i<25;i++) <br/> { <br/> temp=1<<i; <br/> if(b&temp) <br/> return res+i; <br/> } <br/> return 0; <br/> } <br/> void remove(vset &a,int bit) <br/> { <br/> if(bit<25) <br/> { <br/> a.lowbit=a.lowbit^(1<<bit); <br/> return ; <br/> } <br/> else <br/> { <br/> a.highbit=a.highbit^(1<<(bit-25)); <br/> return ; <br/> } <br/> } <br/> vset vset_union(const vset &a,const vset &b) <br/> { <br/> vset res; <br/> res.highbit=a.highbit&b.highbit; <br/> res.lowbit=a.lowbit&b.lowbit; <br/> return res; <br/> } <br/> <br/> <br/> void clique(vset u,int now) <br/> { <br/> if(u.highbit==0 && u.lowbit==0) <br/> { <br/> if(now>max) <br/> { <br/> max=now; <br/> found=1; <br/> } <br/> return; <br/> } <br/> int i; <br/> while(u.highbit || u.lowbit) <br/> { <br/> if(now+vset_size(u)<max) <br/> return; <br/> i=minbit(u); <br/> if(c+now<max) <br/> return ; <br/> remove(u,i); <br/> clique(vset_union(u,num),now+1); <br/> if(found) <br/> return; <br/> } <br/> } <br/> void slv(int n) <br/> { <br/> max=0; <br/> int i; <br/> for(i=n-1;i>=0;i--) <br/> { <br/> found=0; <br/> clique(vset_union(s_vset(i,n),num),1); <br/> c=max; <br/> } <br/> cout<<max<<endl; <br/> } <br/> <br/> int main() <br/> { <br/> int n; <br/> //vset a; <br/> //a=s_vset(6,8); <br/> //cout<<a.lowbit<<endl; <br/> while(cin>>n,n) <br/> { <br/> input(n); <br/> slv(n); <br/> } <br/> return 0; <br/> } <br/><p></p></font></span></p>
4.74 MB, 下载次数: 143, 下载积分: 体力 -2 点
最大团算法
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |