RT,#22 1.04s 98pts TLE
做法确实不是最优的,没有预处理,但是第一次交只TLE了五个点,且所有点都没到1.20s。都到这个时间了我真不想重写了,然后就卡了一个下午的常数并宣告失败。
#include<bits/stdc++.h>
using namespace std;
const int N=28,inf=1e9+7;
int a[N][N],ans=0,sum=inf,n;
void dfs(int x,int s,int cnt,int num1,int num2){
if(cnt>=sum)return ;
if(x==n+1){
sum=cnt;
ans=s;
return ;
}
int cnt1=0,cnt2=0;
for(int i=0;i<(x-1);i++){
if((s&(1<<i)))cnt1+=a[x][i+1];
else cnt2+=a[x][i+1];
}
if(num1<n/2)dfs(x+1,s,cnt+cnt1,num1+1,num2);
if(num2<n/2)dfs(x+1,s+(1<<(x-1)),cnt+cnt2,num1,num2+1);
return ;
}//这里不能开inline,我试了,会跑的巨慢
inline int read()
{
int k=0,f=1;
char c=getchar_unlocked();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar_unlocked();
}
while(c>='0'&&c<='9')k=(k<<3)+(k<<1)+(c-'0'),c=getchar_unlocked();
return k*f;
}
int main()
{
int m,x,y;
n=read(),m=read();
for(int i=1;i<=m;i++){
x=read(),y=read();
a[x][y]=a[y][x]=1;
}
dfs(1,0,0,0,0);
//我尝试过减少传参,但是直接计算会变慢。__builtin_popcount()并没有使我的代码变快。
for(int i=0;i<n;i++){
if(ans&(1<<i))printf("%d ",i+1);
}
return 0;
}