Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <vector>
- #include <stack>
- #include <queue>
- using namespace std;
- const int nmax = 100010;
- int N;
- vector < int > adj[nmax];
- int points[nmax],ind=1,counter=1;
- int lowlink[nmax],index[nmax],z,y,inds;
- vector < int > graph[nmax];
- int scc[nmax];
- bool fix[nmax],stackfix[nmax];
- int S[nmax];
- int ans,curans;
- long long pc[nmax];
- int X[nmax];
- bool fdfs[nmax];
- long long answer[nmax];
- queue < int > que;
- void tarjan(int v)
- {
- index[v] = lowlink[v] = ind++;
- fix[v] = stackfix[v] = true;
- S[inds] = v;
- inds+=1;
- for(int i = 0; i < adj[v].size(); i++)
- {
- int w = adj[v][i];
- if (fix[w])
- {
- if (stackfix[w])
- lowlink[v] = min(lowlink[v], index[w]);
- } else
- {
- tarjan(w);
- lowlink[v] = min(lowlink[v], lowlink[w]);
- }
- }
- if (index[v] == lowlink[v])
- {
- int w;
- do
- {
- w = S[inds-1];
- inds-=1;
- stackfix[w] = false;
- scc[w] = counter;
- if(w==N) z = counter;
- if(w==1) y = counter;
- } while(w != v);
- ++counter;
- }
- }
- void dfs(int u,int z)
- {
- answer[u] = z+pc[u];
- fdfs[u] = true;
- for(int i=0;i<graph[u].size();i++)
- if(!fdfs[graph[u][i]])
- dfs(graph[u][i],answer[u]);
- }
- main()
- {
- freopen("manaobros.in","r",stdin);
- freopen("manaobros.out","w",stdout);
- int i,j,u,v,K;
- scanf("%d",&N);
- for(i=1;i<=N;i++) scanf("%d",&points[i]);
- for(i=1;i<N;i++)
- {
- scanf("%d",&K);
- for(j=0;j<K;j++)
- {
- scanf("%d",&v);
- if(i!=v)adj[i].push_back(v);
- }
- }
- for(i=1;i<=N;i++)
- if(!fix[i])
- tarjan(i);
- for(i=1;i<=N;i++)
- {
- pc[scc[i]]+=(long long)points[i];
- for(j=0;j<adj[i].size();j++)
- if(scc[i]!=scc[adj[i][j]] && X[scc[adj[i][j]]]!=i)
- {
- graph[scc[i]].push_back(scc[adj[i][j]]);
- X[scc[adj[i][j]]]=i;
- }
- }
- dfs(y,0);
- cout << answer[z] << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement