ac代码,就是搜索,好像姿势和别人有点不一样,下面那个vector的原因超时了。差点郁闷死~
#include<iostream>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=105;
int mp[N][N];
int du[N];
int n,m,s;
int R[N],RR[N];
int r1,r2;
int result;
void dfs(int u,int t,int ss){
if(ss==s){
result++;
return ;
}
if(t==r1)return ;
//if((s-ss)<(R.size()-t))return;
for(int i=t;i<r1;++i){
//
int w=R[i];
int j;
for(j=0;j<r2;++j){
int v=RR[j];
if(!mp[w][v])break;
}
if(j==r2){//w yu ji he RR lian tong
RR[r2++]=R[i];
dfs(u,i+1,ss+1);
r2--;
}
}
}
void work(int u){
R[r1++]=u;
RR[r2++]=u;
for(int i=u+1;i<=n;++i){
if(mp[u][i])R[r1++]=i;
}
dfs(u,1,1);
}
int main(){
int T;
int u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&s);
// cout<<n<<m<<s<<endl;
result=0;
memset(mp,0,sizeof mp);
memset(du,0,sizeof du);
for(int i=0;i<m;++i){
scanf("%d%d",&u,&v);
du[u]++;
du[v]++;
mp[u][v]=1;
mp[v][u]=1;
}
/*
if(s==2){
cout<<m<<endl;
continue;
}
*/
int k=s-1;
for(int i=1;i<=n;++i){
mp[i][i]=1;
if(du[i]<k){
du[i]=0;
for(int j=1;j<=n;j++){
mp[i][j]=0;
mp[j][i]=0;
}
}
}
k=n-s+1;
for(int i=1;i<=k;++i){
r1=0;r2=0;
if(du)work(i);
}
printf("%d\n",result);
}
return 0;
}
#include<iostream>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=105;
int mp[N][N];
int du[N];
int n,m,s;
vector<int> R,RR;
int result;
void dfs(int u,int t,int ss){
if(ss==s){
result++;
return ;
}
if(t==R.size())return ;
//if((s-ss)<(R.size()-t))return;
for(int i=t;i<R.size();++i){
//
int w=R[i];
int j;
for(j=0;j<RR.size();++j){
int v=RR[j];
if(!mp[w][v])break;
}
if(j==RR.size()){//w yu ji he RR lian tong
RR.push_back(R[i]);
dfs(u,i+1,ss+1);
}
}
}
void work(int u){
R.clear();
RR.clear();
R.push_back(u);
RR.push_back(u);
for(int i=u+1;i<=n;++i){
if(mp[u][i])R.push_back(i);
}
dfs(u,1,1);
}
int main(){
int T;
int u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&s);
// cout<<n<<m<<s<<endl;
result=0;
memset(mp,0,sizeof mp);
memset(du,0,sizeof du);
for(int i=0;i<m;++i){
scanf("%d%d",&u,&v);
du[u]++;
du[v]++;
mp[u][v]=1;
mp[v][u]=1;
}
//
if(s==2){
cout<<m<<endl;
continue;
}
//
int k=s-1;
for(int i=1;i<=n;++i){
mp[i][i]=1;
if(du[i]<k){
du[i]=0;
for(int j=1;j<=n;j++){
mp[i][j]=0;
mp[j][i]=0;
}
}
}
k=n-s+1;
for(int i=1;i<=k;++i){
if(du)work(i);
}
printf("%d\n",result);
}
return 0;
}
我只是先保存代码,还没提交~