奇怪的40分增加了!

P3387 【模板】缩点

```cpp #include<bits/stdc++.h> using namespace std; int dq[10005],ss[10005],tme,dfn[10005],low[10005],eq[10005],rd[10005],dp[10005],n; bool v[10005]; vector<int>a[10005],b[10005],xtd; stack<int>qwq; void dfs(int x) { tme++; dfn[x]=low[x]=tme; qwq.push(x); v[x]=1; for(int i=0;i<a[x].size();i++) { if(!dfn[a[x][i]]) { dfs(a[x][i]); low[x]=min(low[x],low[a[x][i]]); }else { if(v[a[x][i]]) { low[x]=min(low[x],low[a[x][i]]); } } } if(dfn[x]==low[x]) { while(v[x]) { ss[qwq.top()]=x; v[qwq.top()]=0; eq[x]+=dq[qwq.top()]; qwq.pop(); } xtd.push_back(x); } } inline void xt() { for(int i=1;i<=n;i++) { for(int j=0;j<a[i].size();j++) { if(ss[i]!=ss[a[i][j]]) { b[ss[i]].push_back(ss[a[i][j]]); rd[ss[i]]++; } } } } inline int tp() { queue<int>q; int maxn=0; for(int i=0;i<xtd.size();i++) { if(!rd[xtd[i]]) { q.push(xtd[i]); dp[xtd[i]]=eq[xtd[i]]; } } while(q.size()) { maxn=max(maxn,dp[q.front()]); for(int i=0;i<b[q.front()].size();i++) { dp[b[q.front()][i]]=max(dp[b[q.front()][i]],dp[q.front()]+eq[b[q.front()][i]]); rd[b[q.front()][i]]--; if(!rd[b[q.front()][i]]) { q.push(b[q.front()][i]); } } q.pop(); } return maxn; } int main() { int m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>dq[i]; } while(m--) { int x,y; cin>>x>>y; a[x].push_back(y); } for(int i=1;i<=n;i++) { if(!dfn[i]) { dfs(i); } } xt(); cout<<tp(); return 0; } ```
by Real_Create @ 2021-01-01 22:44:36


|