luogu3119/bzoj3887 草鉴定 (tarjan缩点+spfa)

首先缩一波点,就变成了一个DAG,边权是出点的大小

那我们走到某个点的时候可能会有两种状态:已经走过反边或者没走过

于是就把一个点拆成两层(x和x+N),第二层的点表示我已经走过反边了,每层中的边和原来一样,但对于边(u,v),我们连一个(v,u+N),表示走了这条边的反边,这条边的边权是u的大小

因为DAG中没有环,所以权值不会被重复计算

然后spfa算从belong[1]到bel[1]+N的最长路就行了

 1 #include<bits/stdc++.h>
 2 #define CLR(a,x) memset(a,x,sizeof(a))
 3 using namespace std;
 4 typedef long long ll;
 5 typedef pair<int,int> pa;
 6 const int maxn=1e5+10;
 7 
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
12     return x*neg;
13 }
14 
15 struct Edge{
16     int ne,b,l;
17 }eg[maxn*3];
18 int egh[maxn*2],ect;
19 int eg1[maxn][2],egh1[maxn],ect1;
20 int N,M,dfn[maxn],low[maxn],stk[maxn],sh,tot,bel[maxn],pct,siz[maxn];
21 bool instk[maxn];
22 
23 inline void adeg1(int a,int b){
24     eg1[++ect1][0]=b,eg1[ect1][1]=egh1[a],egh1[a]=ect1;
25 }
26 inline void adeg(int a,int b,int c){
27     eg[++ect].b=b,eg[ect].l=c,eg[ect].ne=egh[a],egh[a]=ect;
28 }
29 
30 void tarjan(int x){
31     dfn[x]=low[x]=++tot,instk[x]=1,stk[++sh]=x;
32     for(int i=egh1[x];i;i=eg1[i][1]){
33         int b=eg1[i][0];
34         if(!dfn[b]) tarjan(b),low[x]=min(low[x],low[b]);
35         else if(instk[b]) low[x]=min(low[x],dfn[b]);
36     }
37     if(dfn[x]==low[x]){
38         ++pct;
39         while(1){
40             instk[stk[sh]]=0;
41             bel[stk[sh]]=pct;siz[pct]++;
42             if(stk[sh--]==x) break;
43         }
44     }
45 }
46 
47 queue<int> q;
48 int dis[maxn*2];
49 bool flag[maxn*2];
50 inline void spfa(){
51     q.push(bel[1]);
52     while(!q.empty()){
53         int p=q.front();q.pop();
54         flag[p]=0;
55         // printf("!%d\n",p);
56         for(int i=egh[p];i;i=eg[i].ne){
57             int b=eg[i].b;
58             if(dis[b]<dis[p]+eg[i].l){
59                 dis[b]=dis[p]+eg[i].l;
60                 if(!flag[b]) q.push(b);
61                 flag[b]=1;
62             }
63         }
64     }
65 }
66 
67 int main(){
68     // freopen("testdata.in","r",stdin);
69     int i,j,k;
70     N=rd(),M=rd();
71     for(i=1;i<=M;i++){
72         int a=rd(),b=rd();
73         adeg1(a,b);
74     }
75     for(i=1;i<=N;i++)
76         if(!dfn[i]) tarjan(i);
77     for(i=1;i<=N;i++){
78         int a=bel[i];
79         for(j=egh1[i];j;j=eg1[j][1]){
80             int b=bel[eg1[j][0]];
81             if(a==b) continue;
82             adeg(a,b,siz[b]);
83             adeg(a+N,b+N,siz[b]);
84             adeg(b,a+N,siz[a]);
85         }
86     }
87     spfa();
88     printf("%d\n",dis[bel[1]+N]);
89     return 0;
90 }

 

转载于:https://www.cnblogs.com/Ressed/p/9934890.html

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值