CDOJ 1431 不是图论 Label:Tarjan || Kosarajn
Description
给出一个nn个点,mm条边的有向图。每个点上有分值,经过这个点时可以获得一定的分数。
一个点可以经过多次,但是一个点上的分数只能获得一次。
问最多能获得多少分数,起点任选。
1<=nn<=30000,1<=mm<=100000
Input
输入包含多组数据
每组数据第一行为nn,mm
接下来nn行,每行有一个数,表示第ii个节点的分值。
接下来mm行,每行有两个数aa、bb,表示有一条从aa到bb的有向边
Output
每组数据输出一行,每行仅有一个整数:可以获得的最多的分数。
Sample Input
5 5
1 1 1 2 3
1 2
2 3
3 1
1 4
1 5
5 3
1 2 3 4 5
1 2
1 3
4 5
Sample Output
6
9
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<queue>
const int MAXN=;
using namespace std; vector<int> G[MAXN],rG[MAXN],Next[MAXN],vec;
int N,m,f[MAXN],vis[MAXN],ref_nod[MAXN],cost_ref[MAXN],cost_nod[MAXN]; void init_(){
memset(vis,,sizeof(vis));
memset(f,,sizeof(f));
memset(ref_nod,,sizeof(ref_nod));
memset(cost_ref,,sizeof(cost_ref));
memset(cost_nod,,sizeof(cost_nod));
for(int i=;i<=N;i++){
G[i].clear();
rG[i].clear();
Next[i].clear();
vec.clear();
}
} void rdfs(int x,int k){
vis[x]=;
ref_nod[x]=k;
cost_ref[k]+=cost_nod[x];
for(int i=;i<rG[x].size();i++){
int to=rG[x][i];
if(!vis[to]) rdfs(to,k);
if(ref_nod[to]!=k) Next[k].push_back(ref_nod[to]);
}
} void dfs(int x){
vis[x]=;
for(int i=;i<G[x].size();i++){
int to=G[x][i];
if(!vis[to]) dfs(to);
}
vec.push_back(x);
} int Sum(int x){
vis[x]=;
if(f[x]>) return f[x];
int tmp=;
for(int i=;i<Next[x].size();i++){
tmp=max(tmp,Sum(Next[x][i]));
}
return f[x]=tmp+cost_ref[x];
} void scc(){
int k=;
memset(vis,,sizeof(vis));
for(int i=;i<=N;i++)
if(!vis[i]) dfs(i);
/**/
memset(vis,,sizeof(vis));
for(int i=vec.size()-;i>=;i--)
if(!vis[vec[i]]) rdfs(vec[i],k++); int tot=;
memset(vis,,sizeof(vis));
for(int i=;i<k;i++){
if(!vis[i]) tot=max(tot,Sum(i));
}
printf("%d\n",tot);
} int main(){
// freopen("01.in","r",stdin);
while(scanf("%d%d",&N,&m)==){
init_();
for(int i=;i<=N;i++) scanf("%d",&cost_nod[i]);
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
rG[y].push_back(x);
}
scc();
}
return ;
}三个类似dfs的玩意儿,记得初始化~
Next记录该强联通的下一个强联通
ref就是各种映射
CDOJ 1431 不是图论 Label:Tarjan || Kosarajn的更多相关文章
- 图论算法-Tarjan模板 【缩点;割顶;双连通分量】
图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...
- 图论_FatherChristmasFlymouse(Tarjan+dijkstra or spfa)
堆优化Dij VS Spfa 堆优化Dij小胜一筹. 题目名字:Father Christmas flymouse (POJ 3160) 这题可以说是图论做的比较畅快的一题,比较综合,很想说一说. 首 ...
- 图论分支-Tarjan初步-点双连通分量
上一次我们讲到了边双,这次我们来看点双. 说实话来说,点双比边双稍微复杂一些: 学完边双,我们先看一道题 第一问都不用说了吧,多余的道路,明显的割边. 是不是首先想到用边双,但是我们来看一个图: 有点 ...
- 图论分支-Tarjan初步-边双联通分量
本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...
- 图论分支-Tarjan初步-割点和割边
所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...
- 【图论】tarjan的离线LCA算法
百度百科 Definition&Solution 对于求树上\(u\)和\(v\)两点的LCA,使用在线倍增可以做到\(O(nlogn)\)的复杂度.在NOIP这种毒瘤卡常比赛中,为了代码的效 ...
- 图论1 Tarjan算法
强连通分量 模板(强联通分量个数+缩点) #include<iostream> #include<cstdio> #define MAXn 100000 #define MAX ...
- 图论之tarjan缩点
缩点,就是把一张有向有环图中的环缩成一个个点,形成一个有向无环图. 首先我介绍一下为什么这题要缩点(有人肯定觉得这是放屁,这不就是缩点的模板题吗?但我们不能这么想,考试的时候不会有人告诉你打什么板上去 ...
- 图论:Tarjan算法
在有向图中,若两点至少包含一条路径可以到达,则称两个顶点强连通,若任意两个顶点皆如此,则称此图为强联通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected com ...
随机推荐
- sql学习笔记--存储过程
存储过程(stored procedure)有时也称sproc,它是真正的脚本,更准确地说,它是批处理(batch),但都不是很确切,它存储与数据库而不是单独的文件中. 存储过程中有输入参数,输出参数 ...
- 在ubuntu上搭建开发环境2---Win7、Ubuntu双系统正确删除Ubuntu
这种删除ubuntu的方式就是针对本博客中搭建双系统的方式:http://www.cnblogs.com/xumenger/p/4459963.html 如果ubuntu不是以wubi方式安装的,那么 ...
- Pyqt QDockWidget 停靠窗体
网上的一个关于QDockWidget 停靠窗体的教程 代码: # -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore i ...
- 【翻译十五】-java并发之固定对象与实例
Immutable Objects An object is considered immutable if its state cannot change after it is construct ...
- MyEclipse 选中右侧编辑的文件时自动展开左侧目录树
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Chrome浏览器之 Postman 安装
Postman 是一款发送 HTTP 请求的 Chrome 插件.开发后端程序的同学可以用它来测试自己写的应用程序是否能够正常访问. 现在由于国内的网络限制, Chrome 浏览器里无法访问“扩展程序 ...
- Eclipse配置Lifery SDK步骤与错误解决。
第一步.我们先去官网下载我们要用的东西 1.Eclipse 2.SDK 3.Tomcat 这是官网下载地址-->https://www.liferay.com/zh/downloads 下面是图 ...
- 最值得学习的10个C语言开源项目
最好别下载最新版,因为代码量比较大,可以下载很早的版本 搜索词:开源 C Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我 ...
- psql-03数据类型(1)
PostgreSQL支持的数据类型远比其他数据库要多; 类型输入与转换 select int '1', date '2015-12-6'; select '1'::int, '2015-12-6':: ...