codeforce round#49D---Mouse Hunt
阿新 • • 發佈:2018-12-19
可以將題目轉化為一個圖,每個節點只有一個出度,對於入度為0的點,如果在該點放陷阱,則必須再次在其後繼節點放,因而有了額外的花費;不斷去掉入度為0的節點後發現最後剩下的一定是一個環,而且不可能是疊加環(因為每個節點出度為1),這時候只需要處理每一個環即可,即取環中花費最小的節點安放陷阱
#include<cstdio> #include<queue> using namespace std; const int n_max=2e5+5; int idegree[n_max],cost[n_max],trans[n_max]; int main() { int n; queue<int>q; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&cost[i]); for(int i=1;i<=n;++i) { scanf("%d",&trans[i]); ++idegree[trans[i]]; } for(int i=1;i<=n;++i) { if(idegree[i]==0) q.push(i); } while(!q.empty()) { int x=q.front(); q.pop(); --idegree[trans[x]]; if(idegree[trans[x]]==0) q.push(trans[x]); } int ans=0; for(int i=1;i<=n;++i) { if(idegree[i]!=0) { int temp=cost[i],u=trans[i]; idegree[i]=0; while(idegree[u]!=0) { temp=min(temp,cost[u]); idegree[u]=0; u=trans[u]; } ans+=temp; } } printf("%d\n",ans); }