IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    BZOJ4080: [Wf2014]Sensor Network 最大团

    wyfcyx发表于 2015-09-04 15:14:05
    love 0

    题解:

    就是一个最大团吧。

    随机一些贪心插入取最大值。

    这个算法效果还是很好的。

    正解貌似是一个二分图匹配?不过数学只是有点欠缺还是略过了。

    代码:

    #include<cstdio>
    #include<cctype>
    #include<cstring>
    #include<climits>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    #define N 110
    int x[N],y[N],p[N];
    bool g[N][N];
    
    int ans[N],num,q[N],cnt;
    int main(){
    #ifndef ONLINE_JUDGE
    	freopen("tt.in","r",stdin);
    #endif
    	int n,d,i,j;
    	cin>>n>>d;
    	for(i=1;i<=n;++i)
    		scanf("%d%d",&x[i],&y[i]);
    	for(i=1;i<=n;++i)
    		for(j=i+1;j<=n;++j)
    			g[i][j]=g[j][i]=((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=d*d);
    	for(i=1;i<=n;++i)
    		p[i]=i;
    	int T=1000;
    	while(T--){
    		for(i=2;i<=n;++i)
    			swap(p[i],p[rand()%(i-1)+1]);
    		cnt=0;
    		for(i=1;i<=n;++i){
    			bool ok=1;
    			for(j=1;j<=cnt;++j)
    				if(!g[p[i]][q[j]]){
    					ok=0;
    					break;
    				}
    			if(ok)
    				q[++cnt]=p[i];
    		}
    		if(cnt>num){
    			num=cnt;
    			memcpy(ans,q,sizeof q);
    		}
    	}
    	printf("%d\n",num);
    	for(i=1;i<=num;++i){
    		if(i>1)
    			putchar(' ');
    		printf("%d",ans[i]);
    	}
    	return 0;
    }


沪ICP备19023445号-2号
友情链接