我发现我到现在都不会估算复杂度啊嘤~从题目的那个sample就感觉是个dfs,因为不断激发的过程可以构成一个搜索树。然后纠结了半天dfs会不会TLE,不过看K=3也就试试好了。><
用vector<int>数组记录某一个signal可以激发哪些module,然后根据signal进行dfs,遍历输入的所有的signal激发相应的module。再根据module的vector<int>E继续激发。
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<ctype.h>
#include<map>
#include<time.h>
#include<bitset>
#include<set>
#include<list>
using namespace std;
//hiho 1136
const int maxn=100010;
const int mod=142857;
int T;
int N;
int M;
class module
{
public:
int S;
int K;
vector<int>E;
public:
module()
{
S=0;
K=0;
E.clear();
}
module(int ss,int kk,int ee[])
{
S=ss;
K=kk;
for(int i=0;i<K;i++)
{
E.push_back(ee[i]);
}
}
};
vector<int>vec[maxn];//map signal to the module
int ans[maxn];
vector<int>start;
module mdu[maxn];
void dfs(vector<int>sig)
{
for(int i=0;i<sig.size();i++)
{
int idx=sig[i];
if(vec[idx].size()!=0)
{
for(int j=0;j<vec[idx].size();j++)
{
int num=vec[idx][j];
ans[num]++;
ans[num]%=mod;
dfs(mdu[num].E);
}
}
}
}
int main()
{
freopen("input.txt","r",stdin);
//freopen("data.txt","r",stdin);
//freopen("out1.txt","w",stdout);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
memset(ans,0,sizeof(ans));
memset(vec,0,sizeof(vec));
start.clear();
scanf("%d %d",&N,&M);
for(int i=0;i<M;i++)
{
int sig=0;
scanf("%d",&sig);
start.push_back(sig);
}
int ss=0;
int kk=0;
int ee[5];
for(int i=1;i<=N;i++)
{
scanf("%d %d",&ss,&kk);
for(int j=0;j<kk;j++)
{
scanf("%d",&ee[j]);
}
mdu[i]=module(ss,kk,ee);
vec[ss].push_back(i);
}
dfs(start);
for(int i=1;i<=N;i++)
{
printf("%d",ans[i]);
if(i!=N)
{
printf(" ");
}
else if(i==N)
{
printf("\n");
}
}
}
return 0;
}