题目链接: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. 解决IDEA快捷键 Alt+Insert 失效的问题

    现象 IDEA快捷键 Alt+Inser 失效,单击右键也不出现[Generate]. 这个问题经常出现在重新安装IDEA后. 原因 缺少2个插件 解决办法 在setting中启用这2个插件即可.这2 ...

  2. linux理论知识点(用于考试)

    ps:为其十天左右的linux培训即将结束了,未雨绸缪,为了更好的通过之后的考试,提前多看些考试题和知识点.这是在chinaunix论坛看到的一个帖子,贴来分享. 原文地址:[http://bbs.c ...

  3. Intellij IDEA中创建Package变成一级目录

    1.创建包,但是出来的却是一级目录 2.因为Compact Middle Packages默认勾选上了,取消掉即可

  4. windows下如何快速删除大文件

    rmdir  磁盘:\文件夹的名字  /s /q; eg:rmdir E:\vue_workspace\KB\day08    /s/q /S 表示除目录本身外,还将删除指定目录下的所有子目录和文件. ...

  5. Python - unittest打印成功信息

    参考 https://stackoverflow.com/questions/36834677/print-success-messages-for-asserts-in-python 总结 clas ...

  6. RuntimeError: cuda runtime error (10) : invalid device ordinal

    This is caused by the unmatching of gpu device number when loading a saved model. torch.load('my_fil ...

  7. linux关闭进程

    查看端口对应的pid lsof -i:8888 若要关闭使用这个端口的程序,使用kill + 对应的pid kill -9 PID号

  8. mongodb插入性能

    转自 https://blog.csdn.net/asdfsadfasdfsa/article/details/60872180 MongoDB与MySQL的插入.查询性能测试     7.1  平均 ...

  9. mysql cmmand not found

    https://www.cnblogs.com/yangzigege/p/8337393.html

  10. day1-4js算术运算符及类型转化

    一,JS的运行环境 在html中使用JS,浏览器去解析 NodeJS环境内封装了JS的解析器 二,JavaScript的特点 1.客户端执行 2.执行顺序自上而下 3.弱类型(数据类型)语言 var ...