zoukankan      html  css  js  c++  java
  • luoguP3387 【模板】缩点

    .....

    我真是个大菜鸡,辣鸡,菜逼....

    模版题

    将强连通分量缩点,在DAG上DP就行了

    然后

    (以下是各种智障错误)

    因为缩点后新建图

    变量名是大写

    各种写成小写

    加边只加了强连通分量中的一个点

    给自己到自己连了条边

    在void函数写了个return f[u]

    我真是个辣鸡

    #include<cstdio>
    #include<algorithm>
    #include<stack>
    using namespace std;
    const int N=1e4+5;
    const int M=2e5+5;
    int n,m;
    struct edge
    {
      int to,next;
    }e[M],E[M];
    int head[N],ecnt,HEAD[N],ECNT,fa[N];
    int val[N],sum[N],f[N],ans;
    int dfn[N],low[N],ti,id[N];
    bool inq[N];
    stack<int>stk;
    void add(int u,int v)
    {
      e[++ecnt].to=v;e[ecnt].next=head[u];head[u]=ecnt;
    }
    void ADD(int u,int v)
    {
      //printf("%d->%d
    ",u,v);
      E[++ECNT].to=v;E[ECNT].next=HEAD[u];HEAD[u]=ECNT;id[v]++;
    }
    void tarjan(int u)
    {
      dfn[u]=low[u]=++ti;
      stk.push(u);inq[u]=1;
      for(int i=head[u],v;i;i=e[i].next)
        {
          if(!dfn[v=e[i].to])
        {
          tarjan(v);
          low[u]=min(low[u],low[v]);
        }
          else if(inq[v]) low[u]=min(low[u],dfn[v]);
        }
      if(dfn[u]==low[u])
        {
          int t;
          do
        {
          t=stk.top();
          stk.pop();
          inq[t]=0;
          fa[t]=u;
          sum[u]+=val[t];
        }while(t!=u);
          //printf("%d->%d
    ",u,sum[u]);
        }
    }
    void dfs(int u)
    {
      for(int i=HEAD[u],v;i;i=E[i].next)
        {
          dfs(v=E[i].to);
          f[u]=max(f[u],f[v]+sum[u]);
        }
      //printf("%d:%d
    ",u,f[u]);
      f[u]=max(f[u],sum[u]);
      ans=max(ans,f[u]);
    }
    int main()
    {
      scanf("%d%d",&n,&m);
      for(int i=1;i<=n;i++) scanf("%d",&val[i]);
      for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),add(u,v);
      for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
      for(int u=1,v;u<=n;u++)
        {
          
          for(int i=head[u];i;i=e[i].next)
        {
          if(fa[u]!=fa[v=e[i].to])
          ADD(fa[u],fa[v]);
    
        }
        }
      for(int u=1;u<=n;u++)if(fa[u]==u && id[u]==0)dfs(u);
      printf("%d
    ",ans);
      return 0;
    }
  • 相关阅读:
    测试markdown
    Ubuntu 部署 k8s集群
    HTML 表格 各标签使用的标准顺序(心得)
    javascript event(事件对象)详解
    CSS3选择器归类整理
    PHP开发中session无法获取和保存问题解决方法
    表单脚本
    PHP页面跳转三种实现方法
    PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
    JS前端将table导出到excel 兼容谷歌 IE 且保留表格样式
  • 原文地址:https://www.cnblogs.com/pigba/p/9035113.html
Copyright © 2011-2022 走看看