➤ Problem Link : 1027D. Mouse Hunt
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
int ans=0;
unordered_set<int> taken;
int dfs(int v,int next[],int cost[],int start[],int n,bool visited[],bool recStack[])
{
if(next[v]==v)
{
start[v]=v;
}
else if(!visited[next[v]])
{
visited[next[v]]=1;
recStack[next[v]]=1;
start[v] = dfs(next[v],next,cost,start,n,visited,recStack);
}
else if(!recStack[next[v]])
{
start[v]=start[next[v]];
}
else
{
int i=next[v];
int mx=v;
while(i!=v)
{
if(cost[mx]>cost[i])
mx=i;
i=next[i];
}
start[v]=mx;
}
if(taken.find(start[v])==taken.end())
{
taken.insert(start[v]);
ans+=cost[start[v]];
}
recStack[v]=0;
// cout<<v<<" "<<start[v]<<endl;
return start[v];
}
int main()
{
int n;
cin>>n;
taken.clear();
int cost[n+1],next[n+1];
bool visited[n+1];
for(int i=1;i<=n;i++)
cin>>cost[i];
for(int i=1;i<=n;i++)
cin>>next[i];
memset(visited,0,sizeof(visited));
int start[n+1];
memset(start,0,sizeof(start));
bool recStack[n+1]={0};
for(int i=1;i<=n;i++)
{
if(!visited[i])
{
visited[i]=1;
recStack[i]=1;
dfs(i,next,cost,start,n,visited,recStack);
}
}
cout<<ans<<"\n";
}
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!
