题目链接:传送门

思路:

强连通缩点,重建图,然后广搜找最长路径。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e6+10;
int head[maxn],next[maxn],ver[maxn],tot;
int low[maxn],num[maxn],tim,co[maxn],col,si[maxn];
int vis[maxn],dis[maxn];
int st[maxn],top,a[maxn],in[maxn],que[maxn],w,t;
int xx[maxn],yy[maxn],nu[maxn],ans,m,n,vv[maxn];
int MIN(int x,int y)
{return x<y?x:y;
}
int MAX(int x,int y)
{return x>y?x:y;
}
void Init()
{memset(vis,0,sizeof(vis));memset(in,0,sizeof(in));memset(vv,0,sizeof(vv));top=0;tim=0;tot=0;col=0;w=0;t=0;
}
void addedge(int u,int v)
{ver[++tot]=v;next[tot]=head[u];head[u]=tot;
}
void Tarjan(int u)
{low[u]=num[u]=++tim;st[++top]=u;for(int i=head[u];i;i=next[i]){int v=ver[i];if(!num[v]){Tarjan(v);low[u]=MIN(low[u],low[v]);}else if(!co[v]) low[u]=MIN(low[u],num[v]);}if(low[u]==num[u]){col++;co[u]=col;si[col]=a[u];vv[col]=MAX(vv[col],vis[u]);while(st[top]!=u){co[st[top]]=col;vv[col]=MAX(vv[col],vis[st[top]]);si[col]+=a[st[top]];top--;}top--;}
}
bool cmp(int x,int y)
{if(xx[x]!=xx[y]) return xx[x]<xx[y];else return yy[x]<yy[y];
}
void Remove()
{memset(head,0,sizeof(head));tot=0;for(int i=1;i<=m;i++){nu[i]=i;xx[i]=co[xx[i]];yy[i]=co[yy[i]];}sort(nu+1,nu+m+1,cmp);
}
void Build()
{for(int i=1;i<=m;i++){int z=nu[i];if(xx[z]!=yy[z]&&(xx[z]!=xx[nu[i-1]]||yy[z]!=yy[nu[i-1]])) addedge(xx[z],yy[z]),in[yy[z]]++;}
}
int main(void)
{int i,j,ss,pp,tp;scanf("%d%d",&n,&m);Init();for(i=1;i<=m;i++){scanf("%d%d",&xx[i],&yy[i]);addedge(xx[i],yy[i]);}for(i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d%d",&ss,&pp);for(i=1;i<=pp;i++){scanf("%d",&tp);vis[tp]=1;}for(i=1;i<=n;i++)if(!num[i]) Tarjan(i);Remove();Build();que[++w]=co[ss];dis[co[ss]]=si[co[ss]];while(t<w){int u=que[++t];for(i=head[u];i;i=next[i]){int v=ver[i];if(dis[v]<dis[u]+si[v]) dis[v]=dis[u]+si[v],que[++w]=v;}}int mx=0;for(i=1;i<=col;i++)if(vv[i]==1) mx=MAX(mx,dis[i]);printf("%d\n",mx);return 0;
}

View Code

转载于:https://www.cnblogs.com/2018zxy/p/10370064.html

LOJ-10096(强连通+bfs)相关推荐

  1. Thrall’s Dream HRBUST - 2048【BFS or 强连通分量】

    立志用最少的代码做最高效的表达 We never paid any heed to the ancient prophecies, like fools we clung to the old hat ...

  2. loj 1210 (求最少的加边数使得图变成强连通)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1210 思路:首先是缩点染色,然后重建并且统计新图中的每个点的入度和出度,于是答案就是m ...

  3. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  4. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  5. 网络流 24 题汇总(LOJ 上只有 22 题???)

    太裸的我就不放代码了...(黑体字序号的题表示值得注意) 1.搭配飞行员 [LOJ#6000] 二分图最大匹配. 2.太空飞行计划 [LOJ#6001] 最小割常规套路.输出方案.(注:这题换行符要用 ...

  6. LOJ #6669 Nauuo and Binary Tree (交互题、树链剖分)

    题目链接 https://loj.ac/problem/6669 题解 Orz yyf太神了,出这种又有意思又有意义的好题造福人类-- 首先\(n\)次询问求出所有节点的深度. 考虑按深度扩展(BFS ...

  7. Loj#2460-「POI2010」桥Bridges【网络流,欧拉回路】

    正题 题目链接:https://loj.ac/p/2460 题目大意 给出nnn个点mmm条边的一张无向图,每条边双向的权值不同,求一条经过的最大权值最小的欧拉回路. 2≤n≤1000,1≤m≤200 ...

  8. Loj#116-[模板]有源汇有上下界最大流

    正题 题目链接:https://loj.ac/p/116 题目大意 nnn个点mmm条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源点汇点的 ...

  9. 【Python算法】遍历(Traversal)、深度优先(DFS)、广度优先(BFS)

    图结构: 非常强大的结构化思维(或数学)模型.如果您能用图的处理方式来规范化某个问题,即使这个问题本身看上去并不像个图问题,也能使您离解决问题更进一步. 在众多图算法中,我们常会用到一种非常实用的思维 ...

最新文章

  1. SAP配置webdynpro完全手册
  2. Caffe源码解析—核函数
  3. 如何删除空文件夹Java_JAVA实现将磁盘中所有空文件夹进行删除的代码
  4. navicat 只对比一张表的数据_Excel VBA批量新建工作表(对比数据透视表的使用)...
  5. 阿里云服务器购买该如何选择?阿里云服务器购买步骤流程介绍...
  6. CSS浮动(二)---Float
  7. 洛谷 - P2181 - 对角线 - 打表 - 组合数学
  8. 关于uint32_t uint8_t uint64_t 的问题
  9. 项目中公用的一些php函数,大多数curl相关的
  10. Markdown数学公式大全
  11. 《Python游戏趣味编程》 第2章 弹跳的小球
  12. 《学习JavaScript数据结构与算法》第三章 数组
  13. python绘制曲线y=2x+5_Python Matplotlib 简易教程
  14. 【TSP问题】基于禁忌搜索算法求解旅行商问题Matlab源码
  15. 命令行看不见光标怎么办
  16. ESP-01S烧录MQTT固件连接阿里云
  17. 如何录制音频文件mp3?给你推荐好用的几款音频录制软件
  18. java 给word加水印,Java 实现在线给word 文档添加水印
  19. 一、什么是JWT?了解JWT,认知JWT
  20. 浮点数比大小(C语言版)

热门文章

  1. 判断链表是否为回文结构
  2. PTA —— 基础编程题目集 —— 编程题 —— 7-3 逆序的三位数 (10 分)
  3. 【Tools】MarkDown教程(二)-MarkDown基本语法
  4. 【ARM】ARM汇编程序设计(四) 选择结构
  5. 【ARM】Cortex存储系统
  6. 【Linux】一步一步学Linux——setfacl命令(117)
  7. 【Linux】一步一步学Linux——groupdel命令(88)
  8. 只允许运行一个实例的方法
  9. LeetCode 437. Path Sum III (STL map前缀和)
  10. 每天一道LeetCode-----计算小于n的素数个数