基本搜索题,代码调了好久。。。
以后继续加强代码能力
#include<stdio.h>
#include<string.h>
#include<algorithm>
using std ::sort;
struct node
{
int t,c[22],num,cc;
}f[222];
int n,m,w;
int vis[222],ans,rou[33],path[33];
bool cmp(node a,node b){
return a.t<b.t;
}
void dfs(int dep,int len,int pre)//dep表示访问的编号,len表示连击,pre表示之前访问的点
{
int i,j,k,mark[11],cou;
if(len>ans){
ans=len;
memcpy(rou,path,sizeof(rou));
}
if(dep==n)return ;
if(n-dep+len<=ans)return ;
if(pre!=-1&&(f[dep].t-f[pre].t>w))return ;
for(i=0,cou=0;i<f[dep].num;i++)
{
k=f[dep].c[i];
if(!vis[k])
mark[cou++]=k;
}
if(cou>=3){
path[len]=f[dep].cc;
for(i=0;i<cou;i++)vis[mark[i]]=1;
dfs(dep+1,len+1,dep);
for(i=0;i<cou;i++)vis[mark[i]]=0;
}
dfs(dep+1,len,pre);
}
int main()
{
int i,j,k,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&w);
for(i=0;i<n;i++)
{
scanf("%d%d",&f[i].num,&f[i].t);
for(j=0;j<f[i].num;j++)
scanf("%d",&f[i].c[j]);
f[i].cc=i+1;
}
sort(f,f+n,cmp);
memset(vis,0,sizeof(vis));
ans=0;
dfs(0,0,-1);
printf("%d\n",ans);
if(ans){
sort(rou,rou+ans);
printf("%d",rou[0]);
for(i=1;i<ans;i++)printf(" %d",rou[i]);
puts("");
}
}
return 0;
}