题目链接: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. C语言笔记 11_头文件&强制类型转换&错误处理&递归

    头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处理指 ...

  2. 说明与比较:new Vue() 和 export default {}

    在生成.导出.导入.使用 Vue 组件的时候,像我这种新手就会常常被位于不同文件的 new Vue() 和 export default{}.它们含义到底是什么,又有什么异同呢? 首先,Vue 是什么 ...

  3. Robot Framework 使用【2】-- MAC系统搭建Robot Framework

    前言 上一篇中讲述了如何在windows环境下搭建Robot Framework,发完帖后有几位小伙伴就私下留言有没有MAC版本的搭建过程,由于笔者MAC上是安装了旧版本的,经过笔者本周零碎时间的尝试 ...

  4. jQuery结合CSS实现手风琴组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Java面向对象编程 -4

    声明static属性 static 是一个关键字,这个关键字主要是用来定义属性和方法. static内存分析 在正常开发之中每一个对象都要保存有各自的属性 所以此时程序没有问题 但是如果country ...

  6. Java面向对象编程 -1.3

    类与对象的定义与使用 在Java之中类是一个独立的结构体,所以需要使用class来进行定义,而类之中主要由属性和方法所组成,那么属性就是一个个具体的变量,方法就是可以重复执行的代码. 定义一个类 cl ...

  7. Lora、zigbee比较

    一 lora 主要频段:470MHz,亚洲其他地区主要是902-928MHz,欧洲主要是868MHz,美洲主要是915mHz lora优点: 通讯距离远(适合半径500m~2km,通信距离大于7000 ...

  8. Solidity顺序编程

    1.事件 是合约和区块链通讯的一种机制.前端可以监听事件. 使用关键字event(参数);来申请 2.require指令: 使用require指令,使得函数在执行过程中,在不满足某些条件的时候抛出错误 ...

  9. Mysql按照字段的重复数排序

    select source_job_number,count(*) as count from v1_user WHERE source_id=3 group by source_job_number ...

  10. C# Stream篇(—) -- Stream基类-----转载

    C# Stream篇(—) -- Stream基类 写在前头: Stream系列文章共收录7篇,本着备忘和归纳的目的本着备忘和归纳的目的,全部收录于本分类中. 下面是有原文连接,望各位看官还是到原作者 ...