Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu

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


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的更多相关文章

  1. 图论算法-Tarjan模板 【缩点;割顶;双连通分量】

    图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...

  2. 图论_FatherChristmasFlymouse(Tarjan+dijkstra or spfa)

    堆优化Dij VS Spfa 堆优化Dij小胜一筹. 题目名字:Father Christmas flymouse (POJ 3160) 这题可以说是图论做的比较畅快的一题,比较综合,很想说一说. 首 ...

  3. 图论分支-Tarjan初步-点双连通分量

    上一次我们讲到了边双,这次我们来看点双. 说实话来说,点双比边双稍微复杂一些: 学完边双,我们先看一道题 第一问都不用说了吧,多余的道路,明显的割边. 是不是首先想到用边双,但是我们来看一个图: 有点 ...

  4. 图论分支-Tarjan初步-边双联通分量

    本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...

  5. 图论分支-Tarjan初步-割点和割边

    所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...

  6. 【图论】tarjan的离线LCA算法

    百度百科 Definition&Solution 对于求树上\(u\)和\(v\)两点的LCA,使用在线倍增可以做到\(O(nlogn)\)的复杂度.在NOIP这种毒瘤卡常比赛中,为了代码的效 ...

  7. 图论1 Tarjan算法

    强连通分量 模板(强联通分量个数+缩点) #include<iostream> #include<cstdio> #define MAXn 100000 #define MAX ...

  8. 图论之tarjan缩点

    缩点,就是把一张有向有环图中的环缩成一个个点,形成一个有向无环图. 首先我介绍一下为什么这题要缩点(有人肯定觉得这是放屁,这不就是缩点的模板题吗?但我们不能这么想,考试的时候不会有人告诉你打什么板上去 ...

  9. 图论:Tarjan算法

    在有向图中,若两点至少包含一条路径可以到达,则称两个顶点强连通,若任意两个顶点皆如此,则称此图为强联通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected com ...

随机推荐

  1. CLR via C#(03)- 对象创建和类型转换

    一. 创建对象 CLR要求用new操作符创建对象,这个操作符在编译时产生的IL指令为newobj.例如: Student XiaoJing=new Student(“XiaoJing”,”1986”) ...

  2. SSIS 包单元测试检查列表

    1. 使用脚本任务(Script tasks) 组建的时候,在日志里增加一些调试信息,例如变量更新信息,可以帮助我们从日志中查看到变量是在何时何地更新的. 2. 使用ForceExecutionRes ...

  3. POJ2762 Going from u to v or from v to u(单连通 缩点)

    判断图是否单连通,先用强连通分图处理,再拓扑排序,需注意: 符合要求的不一定是链拓扑排序列结果唯一,即在队列中的元素始终只有一个 #include<cstdio> #include< ...

  4. git revert 和 git reset的区别

    git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交    * git revert HEAD               ...

  5. Solr入门之(3)常用概念说明(持续补充):

    由于solr底层使用lucene,所以很多概念与lucene相同,下面是几个常用的概念: * Document:一个要进行索引的单元,相当于数据库的一行纪录,任何想要被索引的数据,都必须转化为Docu ...

  6. Nginx+lua环境搭建

    其实有点类似WampServer一站式安装包 wget http://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz tar -zxvf ng ...

  7. Installing Hadoop on Mac OSX Yosemite Tutorial Part 1.

    Installing Hadoop on Mac OSX Yosemite Tutorial Part 1. September 23, 2014 Marek 68 Comments Install ...

  8. 第十九篇:提高SOUI应用程序渲染性能的三种武器

    SOUI是一套100%开源的基于DirectUI的客户端开发框架. 基于DirectUI设计的UI虽然UI呈现的效果可以很炫,但是相对于传统的win32应用程序中每个控件一个窗口句柄的形式,渲染效率是 ...

  9. V for Vendetta

    V for Vendetta V字仇杀队 复仇者V 安迪·沃卓斯基 and Larry Wachowski 思想,是最强大的武器.因为,世界上的独裁政府,有一个共同特点就是推行洗脑和愚民政策. 经典台 ...

  10. ListView中每个item条目在被单击选中时能够高亮显示

    在布局文件中设定: android:listSelector="@android:color/holo_red_light" 在代码中实现 listView.setSelector ...