邻接矩阵调不对了

P3387 【模板】缩点

```c #include<bits/stdc++.h> using namespace std; #define N 1000010 #define ll long long vector<ll> g[N],gnew[N]; ll color[N],vis[N],dfn[N],st[N],low[N],cnt[N],p[N],f[N]; ll ind[N],outd[N],num[N]; ll ix,top,sum,res=0,n,m,ans; void tarjan(ll v) { dfn[v]=++ix; low[v]=ix; vis[v]=1; st[++top]=v; for(ll i=0;i<g[v].size();++i) { ll id=g[v][i]; if(!dfn[id]) { tarjan(id); low[v]=min(low[v],low[id]); } else { if(vis[id]) { low[v]=min(low[v],low[id]); } } } if(low[v]==dfn[v]) { color[v]=++sum;num[sum]+=p[v]; vis[v]=0; while(st[top]!=v) { color[st[top]]=sum; vis[st[top--]]=0; num[sum]+=p[st[top]]; } top--; } } void search(int x) { if(f[x]) return ; f[x]=num[x]; ll maxsum=0; for(int i=0;i<gnew[x].size();++i) { if(!f[gnew[x][i]]) search(f[gnew[x][i]]); maxsum=max(maxsum,f[gnew[x][i]]); } f[x]+=maxsum; } int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;++i) { scanf("%lld",&p[i]); } for(int i=1;i<=m;++i) { ll x,y; scanf("%lld%lld",&x,&y); g[x].push_back(y); } for(ll i=1;i<=n;++i) if(!dfn[i]) tarjan(i); for(int i=1;i<=n;++i) { for(ll k=0;k<g[i].size();++k) { ll v=g[i][k]; if(color[v]!=color[i]) { gnew[i].push_back(color[k]); } } } for(int i=1;i<=sum;i++){ if(!f[i]){ search(i); ans=max(ans,f[i]); } } printf("%d",ans); return 0; } ``` 记忆化搜索也g了
by hfyzyhlez @ 2022-10-19 17:10:58


@[hfyzyhlez](/user/70674) 1. ~~`index`是怎么过编的~~ 2. ```cpp while(st[top]!=v) { color[st[top]]=sum; vis[st[top--]]=0; num[sum]+=p[st[top]]; } ``` 这里`top--`要放在最后 3. ```cpp for(int i=1;i<=n;++i) { for(ll k=0;k<g[i].size();++k) { ll v=g[i][k]; if(color[v]!=color[i]) { gnew[i].push_back(color[k]); index[color[k]]++; } } } ``` 这一段及其混乱,变量名基本搞混了(以及加边时都是`color[...]`)。
by World_Creater @ 2022-10-19 17:46:24


LEZ巨,竟然在写缩点! ------------ 但言归正传,思路确实一如往常的混乱,用脚趾头想想也知道,BUG不知道有多少,实在不想调,看看楼上红名大佬的指点吧
by AK_SLS @ 2022-10-19 22:49:34


|