提交时间:2024-10-21 20:58:57
运行 ID: 33756
#include<bits/stdc++.h> using namespace std; #define int long long #define ll long long #define LD long double #define it __int128 #define lson t[x].ls #define rson t[x].rs #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define x1 gczkaioi #define y1 lylakioi #define yjbakioi true #define popcnt __builtin_popcount #define inx(u) int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #define inw(u) int I=h[u],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} // int read(){int x;scanf("%lld",&x);return x;} const int MAXN=100010,MAXM=4010,N=50,base=131,Mod=1000000007,Mod2=999911659,inf=1000000000,B=1000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int Pow(int x,int y,int p){int rt=1;while(y){if(y&1)rt=rt*x%p;x=x*x%p,y>>=1;}return rt;} // string ejz(int x){string s="";for(int i=0;i<5;i++)s+=x&(1<<i)?"1":"0";return s;} struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT=1;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,x,y,k,m,ans,a[MAXN],f[MAXN][N],g[N],p[MAXN],q[MAXN]; vector<int>G[MAXN]; map<pii,bool>mp; void dfs(int u){ f[u][0]=0; f[u][q[u]]=a[u]; for(auto v:G[u]){ dfs(v); for(int j=0;j<=m;j++)g[j]=0; for(int i=0;i<=m;i++){ if(!mp[mk(p[i],v)]){ for(int j=0;j<=m;j++){ g[j]=max(g[j],f[u][i]+f[v][j]); // cout<<u<<" "<<v<<" "<<p[i]<<" "<<p[j]<<" "<<f[u][j]<<endl; } } // cout<<" "<<u<<"-"<<v<<" "<<i<<" "<<p[i]<<" "<<v<<" "<<mp[mk(p[i],v)]<<endl; } for(int i=0;i<=m;i++)f[u][i]=max(f[u][i],g[i]),ans=max(ans,f[u][i]); } } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++){ int tmp=read(); while(tmp--)G[i].pb(read()); } for(int i=1;i<=m;i++){ int u=read(),v=read(); p[i*2-1]=u,p[i*2]=v; mp[mk(u,v)]=mp[mk(v,u)]=1; } m<<=1; sort(p+1,p+m+1); m=unique(p+1,p+m+1)-p-1; for(int i=1;i<=m;i++)q[p[i]]=i;//,cout<<p[i]<<" ";cout<<endl; dfs(1); printf("%lld",ans); } signed main(){ slv(); return 0; }