P3387 【模板】缩点

题目地址


易错点:

  • 最深刻的孤独,也许并不是面壁者的深思。在那只有一个结点的scc里,不知存放着多少份无处安放的彷徨.
  • 世界上最遥远的距离不是你和我,而是你在搜索树上的那一头,我却在搜索树的这一头。那被有向图规则所束缚着的可达性,令我们天人永隔.

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring> 
using namespace std;
const int MAXN=1000010,MAXM=1000010;
int n;
struct Edge{
    int from,to,nxt;
}firstEdge[MAXM];
int firstHead[MAXN],firstCnt=0;
void addFirstEdge(int u,int v){
    firstEdge[++firstCnt].from=u;
    firstEdge[firstCnt].to=v;
    firstEdge[firstCnt].nxt=firstHead[u];
    firstHead[u]=firstCnt;
}
struct edge{
    int from,to,nxt;
}secondEdge[MAXM];
int secondHead[MAXN],secondCnt=0;
void addSecondEdge(int u,int v){
    secondEdge[++secondCnt].from=u;
    secondEdge[secondCnt].to=v;
    secondEdge[secondCnt].nxt=secondHead[u];
    secondHead[u]=secondCnt;
}
int low[MAXN],dfn[MAXN],tarjanDfnCnt=0;//dfs序号
int stck[MAXN],top=0;//栈
bool inc[MAXN]; 
int c[MAXN],sccCnt=0;//属于的scc 
int sum[MAXN],pointValue[MAXN];//scc权值与点权值 
void tarjan(int x){
    low[x]=dfn[x]=++tarjanDfnCnt;
    inc[x]=1;
    stck[++top]=x;
    for(int i=firstHead[x];i;i=firstEdge[i].nxt){
        int v=firstEdge[i].to;
        if(!dfn[v]){
            tarjan(v);
            low[x]=min(low[x],low[v]);
        }else if(inc[v])low[x]=min(low[x],dfn[v]);
    }
    if(low[x]==dfn[x]){
        int y;sccCnt++;
        do{
            y=stck[top--];
            c[y]=sccCnt;
            inc[y]=0;
            sum[sccCnt]+=pointValue[y]; 
        }while(x!=y);
    }
}
void rebuild(){
    for(int x=1;x<=n;x++)
        for(int i=firstHead[x];i;i=firstEdge[i].nxt){
            int v=firstEdge[i].to;
            if(c[x]!=c[v])addSecondEdge(c[x],c[v]);
        }
}
int dp[MAXN];
void Dp(int x){
    dp[x]=sum[x];
    int maxx=0;
    for(int i=secondHead[x];i;i=secondEdge[i].nxt){
        int v=secondEdge[i].to;
        if(!dp[v])Dp(v);
        maxx=max(maxx,dp[v]);
    }
    dp[x]+=maxx;
}
int main(){
    memset(dfn,0,sizeof(dfn));
    memset(dp,0,sizeof(dp));
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&pointValue[i]);
    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        addFirstEdge(u,v);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i])tarjan(i);
    }
    rebuild();
    int ans=-1;
    for(int i=1;i<=n;i++){
        if(!dp[i])Dp(i);
        ans=max(ans,dp[i]);
    }
    printf("%d\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue 中实现一个可以收缩的 group box,可以使用组件化的思路,将 group box 封装为一个组件,并添加一个按钮来控制其展开/收缩状态。 以下是一个简单的实现示例: ``` <template> <div class="group-box"> <div class="header" @click="toggle"> {{ title }} <span class="icon" :class="{ 'icon-expanded': expanded, 'icon-collapsed': !expanded }"></span> </div> <div class="content" v-show="expanded"> <slot></slot> </div> </div> </template> <script> export default { props: { title: { type: String, required: true, }, }, data() { return { expanded: true, }; }, methods: { toggle() { this.expanded = !this.expanded; }, }, }; </script> <style> .group-box { border: 1px solid #ccc; border-radius: 4px; margin-bottom: 16px; } .header { background-color: #f0f0f0; padding: 8px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; } .icon { width: 12px; height: 12px; border-top: 2px solid currentColor; border-right: 2px solid currentColor; transform: rotate(45deg); } .icon-collapsed { transform: rotate(-135deg); } .content { padding: 8px; } </style> ``` 使用方式: ``` <template> <div> <group-box title="Group Box"> <p>Some content</p> </group-box> </div> </template> <script> import GroupBox from './GroupBox.vue'; export default { components: { GroupBox, }, }; </script> ``` 在上面的示例中,我们创建了一个 `GroupBox` 组件,它接受一个 `title` 属性作为组标题,并使用一个 `expanded` 数据属性来控制组展开/收缩状态。`toggle` 方法用来切换组状态。在组件模板中,我们使用了 `v-show` 指令来根据 `expanded` 属性来控制组展示状态,同时添加了一个按钮来触发 `toggle` 方法。 最后,我们可以在父组件中使用 `GroupBox` 组件,传递标题和内容作为插槽内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值