首页 > 其他分享 >P3387 【模板】缩点 题解

P3387 【模板】缩点 题解

时间:2023-06-26 20:45:01浏览次数:39  
标签:缩点 head int 题解 P3387 ++ dfn low

一、题目描述:

  给你一个 $n$ 个点,$m$ 条边的有向图。点带权。

  求一条路径经过的所有点的权值和最大是多少。点可以重复经过。

  数据范围:$1 \le n \le 1 \times 10^4,1 \le m \le 1 \times 10^5$ 。


 二、解题思路:

  缩点板子题,不需要思路。时间复杂度 $O(n+m)$ 。


 三、完整代码:

 1 #include<iostream>
 2 #include<vector>
 3 #define N 10010
 4 #define M 100010
 5 using namespace std;
 6 vector <int> s[N];
 7 int n,m,l,r,cc,tot,maxx;
 8 int f[N],q[N],d[N],in[N],val[N];
 9 int dfn[N],ans[N],low[N],bel[N];
10 struct EDGE{
11     int v,nxt;
12 }edge[M];
13 int head[N],cnt;
14 void add(int u,int v)
15 {
16     edge[++cnt].v=v;
17     edge[cnt].nxt=head[u];
18     head[u]=cnt;
19 }
20 void tarjan(int u)
21 {
22     f[u]=1;q[++r]=u;dfn[u]=low[u]=++tot;
23     for(int i=head[u];i!=-1;i=edge[i].nxt)
24     {
25         int to=edge[i].v;if(!dfn[to])
26             tarjan(to),low[u]=min(low[u],low[to]);
27         else if(f[to]) low[u]=min(low[u],dfn[to]);
28         //我觉得更新low[u]原因只是为了 
29         //让u知道他自己没资格做新的联通分量的起点
30         //有点比他更适合=>极大联通子图 
31     }
32     if(dfn[u]==low[u])
33     {
34         cc++;do{
35             bel[q[r]]=cc,f[q[r]]=0;
36             s[cc].push_back(q[r]),r--;
37         }while(q[r+1]!=u);
38         //常规操作 
39     } 
40 }
41 int top_sort()
42 {
43     for(int i=1;i<=n;i++)
44         for(int j=head[i];j!=-1;j=edge[j].nxt)
45             if(bel[edge[j].v]!=bel[i])
46                 in[bel[edge[j].v]]++;
47     l=1,r=0;
48     for(int i=1;i<=cc;i++)
49         if(!in[i])
50             q[++r]=i;
51     while(l<=r)
52     {
53         int u=q[l];l++;
54         for(int i:s[u])
55             ans[u]+=val[i];
56         for(int i:s[u])
57             for(int j=head[i];j!=-1;j=edge[j].nxt)
58             {
59                 int to=bel[edge[j].v];
60                 ans[to]=max(ans[to],ans[u]);
61                 in[to]--;if(!in[to])q[++r]=to;
62             }
63     }
64     for(int i=1;i<=cc;i++)
65         maxx=max(maxx,ans[i]);
66     return maxx;
67     //感觉拓扑排序不是很必要,月赛写了个dfs也过了 
68 }
69 int main()
70 {
71     ios::sync_with_stdio(false);
72     cin.tie(0);cout.tie(0);
73     cin>>n>>m;
74     for(int i=1;i<=n;i++)
75         cin>>val[i],head[i]=-1;
76     for(int i=1,u,v;i<=m;i++)
77         cin>>u>>v,add(u,v);
78     for(int i=1;i<=n;i++)
79         if(!dfn[i])
80             tarjan(i);
81     cout<<top_sort()<<'\n';
82     return 0;
83 }

四、写题心得:

  好的,复习了缩点。众所周知初学是在昨天。收获经验如下:

  $1、不要自己想奇怪的方法来写缩点,复杂度高还没正确性=> Exp++$

  $2、vector\ 用起来很舒服,以后都不想用链式前向星了\ qwq=> Exp++$

标签:缩点,head,int,题解,P3387,++,dfn,low
From: https://www.cnblogs.com/yhy-trh/p/17506664.html

相关文章

  • 复旦大学2022--2023学年第二学期(22级)高等代数II期末考试第八大题解答
    八、(10分) 设$n$阶实方阵$A$满足$A^3=A$,证明: 若对任意的实列向量$x$,均有$x'A'Ax\leqx'x$,则$A$是实对称阵.证法一(几何证法) 将题目转换成几何语言:设$\varphi$是$n$维欧氏空间$V$上的线性算子,满足$\varphi^3=\varphi$,若对$V$中任一向量$v......
  • P3388 【模板】割点(割顶) 题解
    一、题目描述:给你一个$n$个点,$m$条边的无向图。求出所有割点,按节点编号升序排序。数据范围:$1\len\le2\times10^4,1\lem\le1\times10^5$。 二、解题思路:板子题,不需要思路。时间复杂度$O(n+m)$。 三、完整代码:1#include<iostream>......
  • 【问题解决】echart formatter 模板变量 精度
    遇到这样的精度问题这是之前的配置formatter:`{serie|{a}}\n{data|{c}}`+this.label,这样实现了不同样式,出现了jsnumber类型的精度问题formatter也可以返回模板,返回样式|模板的形式formatter:function(data){return(......
  • 缓存与DB数据一致性问题解决的几个思路
    使用缓存必然会碰到缓存跟真实数据不一致的问题,虽然我们会在数据发生变化时通知缓存,但是这个延迟时间内必然会导致数据不一致,如何解决一般有下面几个思路:首先,当这个延迟如果在业务上时可以接受的,比如文章阅读、评论次数这样的缓存数据,这样的问题这里不考虑。 类似数据库分布式事务......
  • docker 安装 jenkins 以及安装插件出现的问题解决方式
    使用docker-composeversion:"3.9"services:jenkins:image:jenkins/jenkins:lts-jdk11ports:-"8080:8080"-"5000:5000"volumes:-/root/software/jenkins/jenkins-data:/var/jenkins_homeenvir......
  • D Odd Queries 题解
    原题传送门题意简述给定一个数组,再给出m个各自独立(即这个操作不影响后续的询问)的询问,每次给定一个区间,询问将这个区间每个元素都修改为k后,数组总和会是奇数吗?解决思路由于n的范围很大,所以暴力肯定是不可以了,由于每个询问是独立的,我们不需要修改序列,所以不需要使用数据结构。......
  • 01 矩阵题解
    DescirptionSolution若定义\(f(k)\)为一行有\(k\)个\(1\)的方案数,则\(\displaystylef(k)=\binom{m}{k}x^ky^{m-k}\)。则\(\displaystyleE=\sum_{i=0}^{m}i\sum_{j=1}^{n}\binom{n}{j}f(i)^j\left(\sum_{k=i+1}^{m}f(k)\right)^{n-j}\)。不妨设\(\display......
  • CF321C Ciel the Commander 题解 点分治
    题目链接:http://codeforces.com/problemset/problem/321/C解题思路:点分治模板题。每次找到重心给他分配一个字符,分治往下走的时候分配的字符ASCII码\(+1\)即可。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;vector<int>g[maxn];i......
  • 洛谷P4178 Tree 题解 树上点分治
    题目链接:https://www.luogu.com.cn/problem/P4178解题思路:点分治模板题。设当前重心为\(u\),一共有三种不同类型的路径:路径的一个端点恰好是重心\(u\);路径的两个端点在\(u\)的不同子树中;路径的两个端点在\(u\)的同一个子树中。找到重心\(u\)之后,前两类路径分开求......
  • 基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案
    前些时候有给大家分享一篇uni-app+vite4+uview-plus搭建跨端项目。今天主要分享下在uniapp中渲染markdown语法及uniapp中软键盘弹起,页面tabbar或顶部自定义navbar导航栏被撑起挤压的问题。如上图:支持h5+小程序+App端markdown解析渲染。上面则是演示了在App端+小程序端键盘弹......