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. Overview and Evaluation of Bluetooth Low Energy: An Emerging Low-Power Wireless Technology

    转自:http://www.mdpi.com/1424-8220/12/9/11734/htm Sensors 2012, 12(9), 11734-11753; doi:10.3390/s12091 ...

  2. android 5.1 WIFI图标上的感叹号及其解决办法

    转自:http://blog.csdn.net/w6980112/article/details/45843129 第一次调试android5.1的 WIFI更改小功能 Wifi 源码的相关路径目录  ...

  3. MongoDB的介绍和使用场景(1)

    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发.M ...

  4. Chrome Crx 插件下载

    扯蛋的GFW屏蔽了google域导致下载Chrome插件加载失败,本人想收集以些chrome的Crx插件,可供直接下载 XMarks - 在不同电脑不同浏览器之间同步书签 下载地址:   http:/ ...

  5. 【stut 逆置正整数】

    C语言实验——逆置正整数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入一个三位正整数,将它反向输出. 输入 3位正整数. ...

  6. 解决oracle11g 空表不能exp导出的问题

    在使用exp备份数据库,然后使用imp导入的时候出现了好多表或者视图不存在的错误信息. 究其原因,是11G中增加了一个新的特性:数据条数是0时不分配segment,所以就不能被导出. 解决思路:就是向 ...

  7. Oracle 监听器

    Oracle监听器listener是一个重要的数据库服务器组件,在整个Oracle体系结构中,扮演着重要的作用. 监听器Lisener功能 从当前的Oracle版本看,Listener主要负责下面的几 ...

  8. java 访问 usb

    java 要访问 usb 设备,通常要自己写c/c++代码,然后再用 java 访问这些组件,以达到控制usb设备的目的.但现在有一个开源组件 libusb 帮我们做好了访问usb设备的封装(包括wi ...

  9. 在Salesforce中创建Web Service供外部系统调用

    在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...

  10. selenium实战-自动退百度云共享群

    必备知识 在官网上下好selenium-3.0.1-py2.py3-none-any.whl,然后进入下载文件所在的位置 pip install selenium-3.0.1-py2.py3-none ...