【Codeforces 1027D】Mouse Hunt
阿新 • • 發佈:2019-04-06
ack std 強連通分量 沒有 true all 聯通 fin cin
【鏈接】 我是鏈接,點我呀:)
【題意】
題意
【題解】
先求出來強連通分量。
每個聯通分量裏面,顯然在聯通塊的盡頭(沒有出度)放一個捕鼠夾就ok了
【代碼】
#include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define ms(x,y) memset(x,y,sizeof x) #define ri(x) scanf("%d",&x) #define rl(x) scanf("%lld",&x) #define rs(x) scanf("%s",x) #define oi(x) printf("%d",x) #define ol(x) printf("%lld",x) #define oc putchar(' ') #define os(x) printf(x) #define all(x) x.begin(),x.end() #define Open() freopen("F:\\rush.txt","r",stdin) #define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii; typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int N = 2e5;//節點個數 vector <int> G[N+10],g[N+10]; int n,m,tot = 0,top = 0,dfn[N+10],low[N+10],z[N+10],totn,in[N+10]; int bh[N+10]; int mi[N+10]; bool bo[N+10]; int c[N+10]; int f[N+10],f_ans[N+10]; void dfs(int x){ dfn[x] = low[x] = ++ tot; z[++top] = x; in[x] = 1; int len = G[x].size(); rep1(i,0,len-1){ int y = G[x][i]; if (!dfn[y]){ dfs(y); low[x] = min(low[x],low[y]); }else if (in[y] && dfn[y]<low[x]){ low[x] = dfn[y]; } } if (low[x]==dfn[x]){ int v = 0; totn++; mi[totn] = c[z[top]]; while (v!=x){ v = z[top]; mi[totn] = min(mi[totn],c[v]); in[v] = 0; bh[v] = totn; top--; } } } int dfs1(int x){ if (bo[x]==true) return 0; bo[x] = true; int len = g[x].size(); if (len==0) return mi[x]; return dfs1(g[x][0]); } int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ms(dfn,0); ms(in,0); tot = 0,totn = 0; ri(n); rep1(i,1,n) G[i].clear(),g[i].clear(); rep1(i,1,n){ cin >> c[i]; } rep1(i,1,n){ int x,y; ri(y); x = i; G[x].pb(y); } rep1(i,1,n) if (dfn[i]==0) dfs(i); rep1(i,1,n){ int len = G[i].size(); int xx = bh[i]; rep1(j,0,len-1){ int y = G[i][j]; int yy = bh[y]; if (xx!=yy){ g[xx].pb(yy); } } } n = totn; int ans = 0; rep1(i,1,n) ans += dfs1(i); cout<<ans<<endl; return 0; }
【Codeforces 1027D】Mouse Hunt