BZOJ4080: [Wf2014]Sensor Network 最大团
题解:
就是一个最大团吧。
随机一些贪心插入取最大值。
这个算法效果还是很好的。
正解貌似是一个二分图匹配?不过数学只是有点欠缺还是略过了。
代码:
#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;
}
评论 (0)