我觉得这是一道偏暴力的bfs,虽然水但很不熟练啊,以后要多练。
#include<cstdio>
#include<cstring>
const int Q=200005;
struct edge{int y,next;};
edge a[1110000],b[1110000];
int len=0,last[Q],len1=0,last1[Q],n;
long long s[Q],k[Q],r;
long long f1[Q],f2[Q];//f1[i]表示杀死怪兽衍生物 f2[i]表示杀死怪兽连同他的衍生物
long long Min(long long x,long long y) {return x<y?x:y;}
void ins(int x,int y)
{
int t=++len;
a[t].y=y;a[t].next=last[x];last[x]=t;
}
void ins2(int x,int y)
{
int t=++len1;
b[t].y=y;b[t].next=last1[x];last1[x]=t;
}
int q[Q];
bool v[Q];
int main()
{
memset(v,true,sizeof(v));
memset(last,-1,sizeof(last));
memset(last1,-1,sizeof(last1));
memset(f1,0,sizeof(f1));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&s[i],&k[i],&r);
f2[i]=k[i];
for(int j=1;j<=r;j++)
{
int x;
scanf("%d",&x);
ins(i,x);ins2(x,i);
}
}
int st=1,ed=1;
for(int i=1;i<=n;i++) q[ed++]=i;
for(int x=1;x<=n;x++)
for(int i=last[x];i!=-1;i=a[i].next)
f1[x]+=f2[a[i].y];
/*for(int i=1;i<=n;i++) printf("%lld\n",f1[i]);
printf("\n\n");*/
while(st!=ed)
{
int x=q[st];
st++;v[x]=false;
if(st==Q-1) st=1;
if(f1[x]+s[x]<f2[x])
{
for(int i=last1[x];i!=-1;i=b[i].next)
{
int y=b[i].y;
if(v[y]==false)
{
v[y]=true;
q[ed++]=y;
if(ed==Q-1) ed=1;
}
f1[y]=f1[y]-f2[x]+f1[x]+s[x];
}
f2[x]=f1[x]+s[x];
}
}
//for(int i=1;i<=n;i++) printf("%lld\n",f2[i]);
printf("%lld",f2[1]);
}