- 注册时间
- 2009-5-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 38554
- 在线时间
- 小时
|
楼主 |
发表于 2018-4-6 15:27:36
|
显示全部楼层
根据楼上的提示,安装了igraph,然后写了下面的代码:
- #include <stdio.h>
- #include "igraph.h"
- int main()
- {
- igraph_rng_seed(igraph_rng_default(), 42);
- while (1)
- {
- igraph_integer_t cn;
- igraph_t graph;
- igraph_erdos_renyi_game(&graph, IGRAPH_ERDOS_RENYI_GNP, 168, 0.5, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS);
- igraph_clique_number(&graph, &cn);
- printf("%d ", (int)cn);
- igraph_destroy(&graph);
- }
- return 0;
- }
复制代码
代码虽短,但是运行效率堪忧呀~
当$N=168$时,我自己写的代码$0.9$秒就能跑$1$个图,上述代码要$2.0$秒才能跑$1$个图……
我自己写的代码如下:
- #include<ctime>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- const int n=249,d=n+31>>5;
- unsigned int a[n][d],todo[d],done[d];
- unsigned __int64 g,h,p,q;
- unsigned char i,j,s;
- unsigned char rd()
- {
- g=g*g/3+h+rand();
- return(g&32767)>>14;
- }
- void ad(unsigned char i,unsigned char j)
- {
- a[i][j>>5]|=1<<(j&31);
- a[j][i>>5]|=1<<(i&31);
- }
- unsigned char r(unsigned int p)
- {
- for(unsigned char i=0;;i++)
- if(p&1<<i)return i;
- }
- void mce(unsigned char c,unsigned int *todo,unsigned int *done)
- {
- unsigned char i,j,k;
- unsigned int doing[d];
- for(i=0;i<d;i++)
- if(todo[i]||done[i])
- {
- i=i<<5|r(todo[i]?todo[i]:done[i]);
- for(j=0;j<d;j++)
- doing[j]=~a[i][j]&todo[j];
- for(j=0;j<n;j++)
- {
- unsigned char jh=j>>5;
- unsigned int jl=1<<(j&31);
- if(doing[jh]&jl)
- {
- todo[jh]&=~jl;
- unsigned int nt[d],nd[d];
- for(k=0;k<d;k++)
- nt[k]=todo[k]&a[j][k],nd[k]=done[k]&a[j][k];
- mce(c+1,nt,nd);
- done[jh]|=jl;
- }
- }
- return;
- }
- if(c>s)s=c;
- }
- int main()
- {
- for(g=time(NULL),srand(g);;memset(a,0,sizeof(a)))
- {
- for(i=0;i<n-1;i++)
- for(j=i+1;j<n;j++)
- if(rd())ad(i,j);
- for(i=0;i<n;i++)
- todo[i>>5]|=1<<(i&31);
- mce(0,todo,done);
- p+=s>11,q++,s=0;
- if(q%2<1)printf("%I64u %I64u %c",p,q,13),h+=time(NULL)+p;
- }
- return 0;
- }
复制代码 |
|