Father Christmas flymouse
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 3479   Accepted: 1185

Description

After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such as cleaning out the computer lab for training as extension of his contribution to the team. When Christmas came, flymouse played Father Christmas to give gifts to the team members. The team members lived in distinct rooms in different buildings on the campus. To save vigor, flymouse decided to choose only one of those rooms as the place to start his journey and follow directed paths to visit one room after another and give out gifts en passant until he could reach no more unvisited rooms.

During the days on the team, flymouse left different impressions on his teammates at the time. Some of them, like LiZhiXu, with whom flymouse shared a lot of candies, would surely sing flymouse’s deeds of generosity, while the others, like snoopy, would never let flymouse off for his idleness. flymouse was able to use some kind of comfort index to quantitize whether better or worse he would feel after hearing the words from the gift recipients (positive for better and negative for worse). When arriving at a room, he chould choose to enter and give out a gift and hear the words from the recipient, or bypass the room in silence. He could arrive at a room more than once but never enter it a second time. He wanted to maximize the the sum of comfort indices accumulated along his journey.

Input

The input contains several test cases. Each test cases start with two integers N and M not exceeding 30 000 and 150 000 respectively on the first line, meaning that there were N team members living in N distinct rooms and M direct paths. On the next N lines there are N integers, one on each line, the i-th of which gives the comfort index of the words of the team member in the i-th room. Then follow M lines, each containing two integers i and j indicating a directed path from the i-th room to the j-th one. Process to end of file.

Output

For each test case, output one line with only the maximized sum of accumulated comfort indices.

Sample Input

2 2
14
21
0 1
1 0

Sample Output

35

Hint

32-bit signed integer type is capable of doing all arithmetic.

Source

【思路】

最大点权值路径 tarjian缩点+spfa

缩点的权值只记录正的值。

【code】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define ME 150005
#define NM 500009
vector<int>vec[NM];
int n,m,val[NM],head[NM],dfn[NM],low[NM],u,v;
int col[NM],belong[NM],sumcol,ans,in[NM],out[NM];
int sumedge,stack[NM],instack[NM],dis[NM],inq[NM];
int tim,top;
struct Edge {
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt) {}
} edge[ME];
void add(int x,int y)
{
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
}
void fir()
{
memset(head,,sizeof(head));
memset(stack,,sizeof(stack));
memset(instack,,sizeof(instack));
memset(dis,,sizeof(dis));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(out,,sizeof(out));
memset(in,,sizeof(in));
memset(inq,,sizeof(inq));
for(int i=; i<n; i++)
vec[i].clear();
top=;
sumedge=;
sumcol=;
tim=;
}
void tarjian(int x)
{
dfn[x]=low[x]=++tim;
stack[top++]=x;
instack[x]=;
for(int i=head[x]; i; i=edge[i].nxt)
if(instack[edge[i].y])
low[x]=min(low[x],dfn[edge[i].y]);
else if(!dfn[edge[i].y]) {
tarjian(edge[i].y);
low[x]=min(low[x],low[edge[i].y]);
} else {
}
if(low[x]==dfn[x]) {
sumcol++;
while(stack[top-]!=x) {
col[stack[top-]]=sumcol;
instack[stack[top-]]=false;
top--;
}
stack[top]=sumcol;
top--;
}
}
void spfa()
{
queue<int>q;
q.push();
inq[]=;
while(!q.empty()) {
int now=q.front();
q.pop();
inq[now]=;
for(int i=vec[now].size()-; i>=; i--) {
int to=vec[now][i];
if(dis[to]<dis[now]+belong[to]) {
dis[to]=dis[now]+belong[to];
if(!inq[to]) {
inq[to]=;
q.push(to);
} }
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)) {
fir();
for(int i=; i<n; i++)
{
scanf("%d",&val[i]);
val[i]=max(val[i],);
} for(int i=; i<=m; i++)
{
scanf("%d %d",&u,&v);
add(u,v);
}
for(int i=; i<n; i++)
if(!dfn[i])tarjian(i);
for(int i=;i<n;i++)cout<<col[i]<<endl;
for(int i=; i<n; i++)
belong[col[i]]+=val[i];
for(int i=; i<n; i++) {
for(int j=head[i]; j; j=edge[j].nxt) {
if(col[i]==col[edge[j].y])continue;
vec[col[i]].push_back(col[edge[i].y]);
out[col[i]]++;
in[col[edge[i].y]]++;
}
}
for(int i=;i<=sumcol;i++)
if(!in[i])vec[].push_back(i);
spfa();
for(int i=; i<=sumcol; i++) {
if(!out[i])ans=max(ans,dis[i]);
}
printf("%d\n",ans);
}
return ;
}

Father Christmas flymouse的更多相关文章

  1. POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3241   Accep ...

  2. POJ 3126 --Father Christmas flymouse【scc缩点构图 &amp;&amp; SPFA求最长路】

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3007   Accep ...

  3. L - Father Christmas flymouse

    来源poj3160 After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ...

  4. poj 3160 Father Christmas flymouse

    // 题目描述:从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,比如打扫集训用的机房等等.当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物.集 ...

  5. poj 3160 Father Christmas flymouse【强连通 DAG spfa 】

    和上一道题一样,可以用DAG上的动态规划来做,也可以建立一个源点,用spfa来做 #include<cstdio> #include<cstring> #include< ...

  6. POJ——T3160 Father Christmas flymouse

    Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3496   Accepted: 1191 缩点,然后每个新点跑一边SPFA ...

  7. Father Christmas flymouse--POJ3160Tarjan

    Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...

  8. POJ:3160-Father Christmas flymouse

    Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...

  9. 【转】Tarjan&LCA题集

    转自:http://blog.csdn.net/shahdza/article/details/7779356 [HDU][强连通]:1269 迷宫城堡 判断是否是一个强连通★2767Proving ...

随机推荐

  1. PHP session回收机制(转)

    由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...

  2. uwsgi报错:listen queue of socket ...

    Linux默认的socket链接为128,uwsgi默人的链接为100 需要修改系统默认的配置参数, 然后修改uwsgi配置:listen参数:1024

  3. 多通道 移位寄存器 verilog

    // Quartus II Verilog Template // Basic 64-stage shift register with multiple taps module basic_shif ...

  4. Xenomai PC开发环境

    这两天总在纠结编译一个PC机上的Xenomai开发环境,选择编译器.kernel版本和IPIP版本,但是今天忽然想到,上位机只是个开发环境,只要能编译.能运行就可以了,实时性根本不是关注的东西.而Xe ...

  5. 【Python基础】之异常

    一.常见异常 try: open('abc.txt','r') except FileNotFoundError: print('异常啦!') 输出结果: ======= 异常啦! 我们通过 open ...

  6. 常用yum命令小结

    基于rpm的软件包管理器 yum,是Yellow dog Updater, Modified的简称,是一种软件包管理器.它能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系,并且一次安装 ...

  7. 多媒体开发之---live555的多线程支持,原本只是单线程,单通道

    1)我对Live555进行了一次封装,但是Live555 是单线程的,里面定义的全局变量太多,我封装好dll库后,在客户端调用,因为多个对话框中要使用码流,我就定义了多个对象从设备端接收码流,建立多个 ...

  8. Micro Python:运行在微控制器上的Python

    Micro Python运行在微控制器上的Python.遵守MIT协议.由剑桥大学的理论物理学家乔治·达明设计.和Arduino类似,但Micro Python更强大. Micro Python的软件 ...

  9. 开始使用gradle

    前提配置gradle环境 每个gradle构建都是以一个脚本开始的.gradle构建默认的名称为build.gradle.当在shell中执行gradle命令时,gradle会去寻找为build.gr ...

  10. vue-cli3.0升级失败,vue-cli卸载不掉,vue-cli升级不了3.0

    https://juejin.im/post/5bf7d67c51882518805acb1a vue-cli3.0 使用图形化界面创建和管理项目