40分求助

P3387 【模板】缩点

同问 ```pascal #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; int n,m;const int maxn=10005; vector<int> ve[maxn]; vector<int> sd[maxn]; int dq[maxn]; int dq2[maxn];int dp[maxn]; int dfn[maxn],low[maxn],cnt=0; int colo[maxn]; int sta[maxn];int din=0; int inq[maxn]; void dfs(int x,int fa){ int sz=ve[x].size(); dfn[x]=low[x]=++cnt; inq[x]=1; sta[++din]=x; rep(i,0,sz-1){ int y=ve[x][i]; if(dfn[y]&&inq[y]){ low[x]=min(low[x],dfn[y]); }else{ dfs(y,x); low[x]=min(low[x],low[y]); } } if(low[x]==dfn[x]){ while(din&&sta[din]!=x){ if(!din)break; dq2[x]+=dq[sta[din]]; inq[sta[din]]=0; colo[sta[din--]]=x; } if(din){ dq2[x]+=dq[x]; colo[sta[din--]]=x; } }else dq2[x]=dq[x]; } int dfs2(int x){ if(dp[x]!=0x3f3f3f3f)return dp[x]; dp[x]=dq2[x]; int sz=sd[x].size(); rep(i,0,sz-1)dp[x]=max(dp[x],dfs2(sd[x][i])+dq2[x]); return dp[x]; } int main(){ scanf("%d%d",&n,&m); rep(i,1,n)scanf("%d",dq+i); rep(i,1,m){ int u,v;scanf("%d%d",&u,&v); ve[u].push_back(v); } rep(i,1,n)if(!dfn[i])dfs(i,-1); #ifdef LOCAL rep(i,1,n)cout<<dfn[i]<<" ";;cout<<endl; rep(i,1,n)cout<<low[i]<<" ";;cout<<endl; rep(i,1,n)cout<<colo[i]<<" ";;cout<<endl; rep(i,1,n)cout<<dq2[i]<<" ";;cout<<endl; #endif rep(i,1,n){ int sz=ve[i].size(); rep(j,0,sz-1) if(colo[ve[i][j]]!=colo[i]) sd[colo[i]].push_back(colo[ve[i][j]]); } #ifdef LOCAL rep(i,1,n)if(colo[i]){ int sz=sd[i].size(); rep(j,0,sz-1)cout<<sd[i][j]<<" "<<" "; cout<<endl; } #endif int ans=0; memset(dp,0x3f,sizeof dp); rep(i,1,n)if(colo[i]==i)ans=max(ans,dfs2(i)); cout<<ans<<endl; return 0; } ```
by ferrum_cccp @ 2018-11-21 23:26:18


|