求问两种边的连接方式有什么区别,一个80,一个AC

P3387 【模板】缩点

```cpp ```cpp #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #include<queue> #define re register using namespace std; int n,m; struct edge{int v;}; vector<edge>g[20000]; vector<edge>gg[20000]; bool b[10010][10010]; struct eddd{int u,v;}; eddd e[20000]; int st[250000]; int a[10050]; int top=0; int cnt=0; int d[12512]; int low[12200],dfn[12200]; int vis[12200],pre[12200],ru[12200]; int huan[12200]; int tot=0; int rd(){ int out=0,f=1; char c=getchar(); if(c==45)f=-1; while(c<48||c>57)c=getchar(); while(c>=48&&c<=57){ out=(out<<1)+(out<<3)+c-48; c=getchar(); } return out*f; } void rt(int x){ if(x<0){ putchar(45); x=-x; } if(x>9)rt(x/10); putchar(x%10+48); } inline int minn(int a,int b){ int tm=(a-b)>>31; return a&tm|b&~tm; } inline int maxx(int a,int b){ int tm=(a-b)>>31; return a&~tm|b&tm; } void tarjan(int u){ vis[u]=1; low[u]=dfn[u]=++cnt; st[++top]=u; for(int i=0;i<g[u].size();i++){ int v=g[u][i].v; if (!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if (vis[v]) { low[u]=min(low[u],dfn[v]); } } if (dfn[u]==low[u]){ int y; while (1){ y=st[top--]; pre[y]=u; vis[y]=0; if (u==y) break; a[u]+=a[y]; } } } int topsort(){ queue<int>q; int tt=0; for(int i=1;i<=n;i++) if(pre[i]==i&&!ru[i]){ tt++; q.push(i); d[i]=a[i]; } while(!q.empty()){ int u=q.front(); q.pop(); for(int i=0;i<gg[u].size();i++){ int v=gg[u][i].v; d[v]=max(d[v],d[u]+a[v]); ru[v]--; if(ru[v]==0) q.push(v); } } int ans=0; for (int i=1;i<=n;i++) ans=max(ans,d[i]); /* for (int i=1;i<=n;i++) if(pre[i]==i) cout<<d[i]<<endl;*/ return ans; } int main(){ // freopen("1.in","r",stdin); // freopen("1.out","w",stdout); scanf("%d%d",&n,&m); for(re int i=1;i<=n;i++) scanf("%d",&a[i]); for(re int i=1;i<=m;i++){ scanf("%d%d",&e[i].u,&e[i].v); g[e[i].u].push_back((edge){e[i].v}); } for(re int i=1;i<=n;i++) if(!dfn[i]){ tarjan(i); // cout<<i<<endl; } for(re int i=1;i<=n;i++){ for(int j=0;j<g[i].size();j++){ int x=pre[i],y=pre[g[i][j].v]; if(x!=y&&!b[x][y]){ b[x][y]=1; gg[x].push_back((edge){y}); ru[y]++; } } } /* for(int i=1;i<=n;i++){ cout<<i<<":"; for(int j=0;j<gg[i].size();j++){ cout<<gg[i][j].v<<" "; } cout<<"\n"; cout<<"点权:"<<a[i]; cout<<endl; }*/ printf("%d",topsort()); return 0; } ``` AC ```
by 3612999a @ 2018-10-26 10:50:01


%%%
by opened @ 2018-10-26 11:20:15


|