Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int dfs(int node,int p,vector<vector<int>> &g){
- int ans=1;
- for(auto x:g[node]) {
- if(x!=p) ans+=dfs(x,node,g);
- }
- return ans;
- }
- int main()
- {
- int n,m;
- cin>>n>>m;
- vector<vector<int>> g(n+1);
- vector<int> prim(m),dep,indegree(n+1,0);
- vector<vector<int>> edge;
- set<vector<int>> st_edge;
- for(int i=0;i<m;i++) cin>>prim[i];
- cin>>m;dep.resize(m);
- for(int i=0;i<m;i++) cin>>dep[i];
- for(int i=0;i<min(dep.size(),prim.size());i++){
- g[prim[i]].push_back(dep[i]);
- indegree[dep[i]]++;
- edge.push_back({prim[i],dep[i]});
- st_edge.insert({prim[i],dep[i]});
- }
- int ans=0;
- vector<int> vis(n+1,0);
- queue<int> q;
- for(int i=1;i<=n;i++) if(indegree[i]==0) q.push(i);
- while(!q.empty()){
- int temp=q.front();q.pop();
- ans++;
- vis[temp]=1;
- for(auto x:g[temp]){
- indegree[x]--;
- if(indegree[x]==0) q.push(x);
- }
- }
- for(auto x:edge){
- int n1=x[0],n2=x[1];
- if(vis[n1]==0 && vis[n2]==0 && st_edge.find({n2,n1})!=st_edge.end()){
- int temp = max(dfs(n1,n2,g),dfs(n2,n1,g));
- ans+=temp;
- vis[n1]=1;
- vis[n2]=1;
- }
- }
- cout<<ans<<"\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment