题目链接:P3387 【模板】缩点

缩点板子,所谓\(dp\)就是拓扑排序(毕竟可以重走边),像\(SPFA\)一样松弛就好,就是重边极其烦人,还加了排序(绝对自己想的,然鹅拓扑的思路不是)。

下面上代码:

(为了突出惨烈性,我把调试语句留了下来......)

\(Code\):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
struct node
{
int to,nxt;
}e[MAXN],g[MAXN];
int heade[MAXN],cnte=0;
int headg[MAXN],cntg=0;
void adde(int u,int v)
{
e[++cnte].to=v;
e[cnte].nxt=heade[u];
heade[u]=cnte;
}
void addg(int ux,int vx)
{
g[++cntg].to=vx;
g[cntg].nxt=headg[ux];
headg[ux]=cntg;
}
int low[MAXN],num[MAXN],belong[MAXN],vis[MAXN];
int c=0,val[MAXN];
stack<int> s;
queue<int> q;
int indexx=0;
int n,m,l,r,w[MAXN];
void dfs1(int cur,int fa)
{
low[cur]=++indexx;
num[cur]=indexx;
s.push(cur);
vis[cur]=1;
for(int i=heade[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(!low[j]) dfs1(j,cur),low[cur]=min(low[cur],low[j]);
else if(vis[j])low[cur]=min(low[cur],num[j]);
}
if(low[cur]==num[cur])
{
int k;
c+=1;
do
{
k=s.top();
s.pop();
vis[k]=0;
belong[k]=c;
val[c]+=w[k];
}while(cur!=k);
}
}
int b[MAXN],maxn=0,deg[MAXN],dis[MAXN]={0};
struct gg
{
int uu,vv;
}dl[MAXN];
int cuv=0;
bool cmp(gg n,gg m)
{
if(n.uu^m.uu) return n.uu<m.uu;
else return n.vv<m.vv;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=m;i++) scanf("%d%d",&l,&r),adde(l,r);
for(int i=1;i<=n;i++) if(!low[i]) dfs1(i,i);
/*for(int i=1;i<=n;i++) cout<<belong[i]<<" ";
cout<<endl;
for(int i=1;i<=c;i++) cout<<val[i]<<" ";
cout<<endl;*/
for(int i=1;i<=n;i++)
{
for(int x=heade[i];x;x=e[x].nxt)
{
int j=e[x].to;
int k=belong[i];
int t=belong[j];
if(t^k) dl[++cuv].uu=k,dl[cuv].vv=t;
//addg(k,t),deg[t]++,cout<<k<<" "<<t<<"\n";
}
}
//cout<<endl;
sort(dl+1,dl+cuv+1,cmp);
int lu=-1,lv=-1;
for(int i=1;i<=cuv;i++)
{
if((dl[i].uu!=lu)||(dl[i].vv!=lv))
{
//cout<<dl[i].uu<<" "<<dl[i].vv<<"\n";
addg(dl[i].uu,dl[i].vv);
lu=dl[i].uu,lv=dl[i].vv;
deg[dl[i].vv]++;
}
else continue;
}
/*for(int i=1;i<=c;i++) cout<<deg[i]<<" ";
cout<<endl;
for(int i=1;i<=c;i++)
{
for(int j=headg[i];j;j=g[j].nxt) cout<<g[j].to<<" ";
cout<<"\n";
}*/
for(int i=1;i<=c;i++)
{
if(!deg[i]) q.push(i);
}
for(int i=1;i<=c;i++) dis[i]=val[i];
while(!q.empty())
{
int now=q.front();
q.pop();
//cout<<now<<" ";
for(int i=headg[now];i;i=g[i].nxt)
{
int j=g[i].to;
deg[j]--;
dis[j]=max(dis[j],dis[now]+val[j]);
if(!deg[j]) q.push(j);
}
}
//cout<<endl;
for(int i=1;i<=c;i++) maxn=max(maxn,dis[i]);
//for(int i=1;i<=c;i++)cout<<dis[i]<<" ";
printf("%d\n",maxn);
return 0;
}

其实除了码量还挺朴素的......

解题报告+板子:luogu P3387 【模板】缩点的更多相关文章

  1. 解题报告:luogu P1115(模板 最大子段和)

    题目链接:P1115 最大子段和 告诉你,这个我调了一天的题是橙题...... 线性容易得到,放篇题解: #include<bits/stdc++.h> using namespace s ...

  2. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  3. 模板+解题报告:luogu P3385 【模板】负环

    题目链接:P3385 [模板]负环 缩点板子. 看日报上说\(DFS\)会炸(我确实打炸了),就根据他的说明\(yy\)了\(BFS\),多一个记录步数的数组即可(我用的\(len[]\)),若\(l ...

  4. 解题报告:luogu P1433 吃奶酪

    题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站 ...

  5. 解题报告:luogu P2299

    题目链接:P2299 Mzc和体委的争夺战 单源最短路板子题吗,体面晦涩难懂(语文不好),以为是有向图,只有\(30pts\),其实是无向的,我使用了刚学来的\(SPFA\),通过了此题: \(Cod ...

  6. 解题报告:luogu P2220

    指挥使走后一脸懵逼,然后想起了一道水\(SB\)的省选题. 这是毒瘤乘法分配率的应用,似乎还有一篇,算是入门题. 对了,这题连接:P2220 [HAOI2012]容易题 然而蒟蒻还是先自闭了一会... ...

  7. 解题报告:luogu P1196 [NOI2002]银河英雄传说

    由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...

  8. 解题报告:luogu P5543 [USACO19FEB]The Great Revegetation S

    题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想 ...

  9. 解题报告:luogu P5745 【深基附B例】数列求和

    题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出, ...

随机推荐

  1. BeanUtils学习笔记

    一. 简介 BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行简化操作处理.一个JavaBean通常包含了大量的属性,很多情况下,对JavaB ...

  2. Manjaro 安装 ibus-rime 输入法

    Manjaro 安装 ibus-rime 输入法 安装软件包: sudo pacman -S ibus ibus-rime yay -S ibus-qt 编辑/添加配置文件~/.xprofile: e ...

  3. Bugku-CTF加密篇之简单加密(e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA)

    简单加密   e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA    

  4. 【代码审计】VAuditDemo 前台搜索注入

    在search.php中 $_GET['search']未经过任何过滤传入到$query的执行语句中

  5. 【代码审计】VAuditDemo 重装漏洞

    一.源码安装漏洞介绍 一般在PHP源码程序都有一个初始安装的功能,如果相关代码没有对参数进行严格过滤,可能会导致攻击者访问安装页面(install.php)或构造数据包,对网站进行重新安装,从而危害网 ...

  6. vue调试工具vue-devtools安装及使用方法

    vue调试工具vue-devtools安装及使用方法 https://www.jb51.net/article/150335.htm 本文主要介绍 vue的调试工具 vue-devtools 的安装和 ...

  7. 【原】Django常用命令总结

    1.终端命令 # 查看django版本 $ python -m django --version # 创建项目,名为mysite $ django-admin startproject mysite ...

  8. c++ 读取、输出txt文件

    下面这段话转自:https://blog.csdn.net/lightlater/article/details/6326338 关于文本文件的文件头 第一 ANSI文件的文件头为空,不需要处理: 第 ...

  9. 结对编程任意Android App Demo

    一.产品说明 1.编写目的:用于获取百度图标. 2.情景设计:本产品用于展示图标.随着21世纪各类元素的普及,大部分的人群想下载各类网站的图标,也为了方便用户更便捷的下载而开发的. 3.Demo主要实 ...

  10. Update(Stage4):sparksql:第3节 Dataset (DataFrame) 的基础操作 & 第4节 SparkSQL_聚合操作_连接操作

    8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset ...