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 ...
随机推荐
- win10总是自动重启的解决办法
win10总是自动重启的解决办法_百度经验http://jingyan.baidu.com/article/7908e85c983523af481ad214.html
- Delphi之DLL知识学习4---创建DLL
下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...
- HDU 1227 Fast Food
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1227 题意:一维坐标上有n个点,位置已知,选出k(k <= n)个点,使得所有n个点与选定的点中 ...
- play-framework的安装与使用
一.下载: 到http://www.playframework.com/download下载 解压好包,然后输入: activator ui 访问:http://127.0.0.1:8888/home
- Win10 创建应用程序包及部署
https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh454036.aspx https://msdn.microsoft.com/ ...
- Debian 的 preinst, postinst, prerm, 和 postrm 脚本
转自:http://jianjian.blog.51cto.com/35031/395468 这些是软件包安装前后自动运行的可执行脚本. 统称为控制文件, 是 Deian 软件包的"控制&q ...
- bbed的使用--查看数据文件信息 & sid信息
1.得到文件的块大小和数据块个数 在Linux和Unix上,oracle提供了一个小工具dbfsize用于查看文件块大小 (可以参看[ID:360032.1]How to detect and fix ...
- Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)
题目链接:http://codeforces.com/problemset/problem/20/C 思路:需要用优化过的dijkstra,提供两种写法. #include <iostream& ...
- Linux学习笔记(12)用户和用户组管理
越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范.在Linux中主要是通过用户配置文件来查看和修改用户信息. 1 用户信息文件 (1)用户信息文件/etc/passw ...
- kafka producer源码
producer接口: /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor l ...