// 题目描述:
从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,
比如打扫集训用的机房等等。当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物。
集训队员住在校园通过宿舍的不同寝室里。为了节省体力,flymouse决定从某个寝室出发,沿着
一些有向路一个接一个地访问寝室并顺便发放礼物,直到所有集训队员的起始走遍为止。
以前flymouse在集训队的日子里,他给其他队员留下了不同的印象。他们中的一些人,比如
LiZhiXu,对flymouse的印象特别好,将会为他的好心唱赞歌;而其他一些人,比如snoopy,将
不会宽恕flymouse 的懒惰。flymouse 可以用一种安慰指数来量化他听了这些队员的话语后心情
是好还是坏(正数表示是心情好,负数表示心情坏)。当到达一个寝室时,他可以选择进入寝室、
发放礼物、倾听接收礼物的队员的话语,或者默默地绕开这个寝室。他可能会多次经过一个寝室,
但决不会第二次进入该寝室。他想知道在他发放礼物的整个旅程,他收获安慰指数的最大数量。 // 缩点 把强连通分量内的值加起来(负数就不加了吧 开始我没想到有负数 WA了)
// 然后就是 DAG(无回路有向图)的单源最长路径 这个简单dp了
// 先拓扑排序 根据拓扑排序进行dp 然后就OK了 #include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 300100
#define maxm 30010
struct Edge{
int to;
int next;
Edge(){};
Edge(int u,int v){to=u;next=v;}
}E[maxn];
stack<int> S;
int V[maxm],num,sccV[maxm];
int belong[maxm];
int pre[maxm];
int dfst,scc;
bool tag[maxm];
int in[maxm];//,out[maxm];
int val[maxm],sccval[maxm];
void init(int n){
dfst=scc=;
num=;
while(!S.empty())
S.pop();
for(int i=;i<=n;i++){
V[i]=-;
pre[i]=;
belong[i]=;
}
}
void add(int u,int v){
E[num].to=v;
E[num].next=V[u];
V[u]=num++;
}
void sccadd(int u,int v){
E[num].to=v;
E[num].next=sccV[u];
sccV[u]=num++;
}
int tarjan(int u){
int lowu=pre[u]=++dfst;
int v,e;
S.push(u);
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(!pre[v]){
int lowv=tarjan(v);
lowu=min(lowu,lowv);
}
else if(!belong[v]) lowu=min(lowu,pre[v]);
}
if(lowu==pre[u]){
scc++;
sccval[scc]=;
for(;;){
int x=S.top();S.pop();
if(val[x]>)// 记得把负数舍掉、居然还搞负数 害我wa了、去看了下讨论板才知道的、、
sccval[scc]+=val[x];// scc 的val
belong[x]=scc;
if(x==u) break;
}
}
return lowu;
}
int top[maxm],tn;
void topsort(){
int i,e;
tn=;
for(i=;i<=scc;i++)tag[i]=;
while(){
for(i=;i<=scc;i++)
if(!tag[i]&&!in[i])
break;
if(i>scc) break;
tag[i]=true;
top[tn++]=i;
for(e=sccV[i];e!=-;e=E[e].next){
in[E[e].to]--;
}
}
}
int dis[maxm];
int main()
{
int n,m,T;
int u,v;
int i,j;
//scanf("%d",&T);
while(scanf("%d %d",&n,&m)!=EOF){
init(n);
for(i=;i<=n;i++){
scanf("%d",&val[i]);
}
for(i=;i<=m;i++)
{
scanf("%d %d",&u,&v);
add(u+,v+);
}
for(i=;i<=n;i++)
if(!pre[i]) tarjan(i);
// for(i=1;i<=n;i++) printf("%d ",belong[i]);
int ans=-MOD;
for(i=;i<=scc;i++) {
in[i]=;
sccV[i]=-;
dis[i]=sccval[i];
ans=max(ans,dis[i]);
}
int e,u,v;
for(i=;i<=n;i++)
{
for(e=V[i];e!=-;e=E[e].next){
u=belong[i];
v=belong[E[e].to];
if(u!=v){
in[v]++;
// out[u]++;//,printf("v=%d ",v);
sccadd(u,v);
}
}
}
topsort();
for(i=;i<tn;i++){
u=top[i];
for(e=sccV[u];e!=-;e=E[e].next){
v=E[e].to;
if(dis[v]<dis[u]+sccval[v]){
dis[v]=dis[u]+sccval[v];
ans=max(dis[v],ans);
}
}
}
printf("%d\n",ans);
}
return ;
}

poj 3160 Father Christmas flymouse的更多相关文章

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

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

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

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

  3. POJ——T3160 Father Christmas flymouse

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

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

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

  5. Father Christmas flymouse

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

  6. POJ:3160-Father Christmas flymouse

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

  7. L - Father Christmas flymouse

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

  8. Father Christmas flymouse--POJ3160Tarjan

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

  9. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

随机推荐

  1. 20160723数据结构节alexandrali

    大坑最后再填. 20160803:心情好回来填啦(5/7) 做的题目是: poj2970 我们先每个人都不给钱qwq 然后我们发现有一位的工作时间超过了d 那么我们就从以前安排过工作的人里,a最大的, ...

  2. POJ1442Black Box

    http://poj.org/problem?id=1442 题意 : 题目中对给出的数字有两种操作ADD(I)操作,将ADD括号里的数字 I 加到数列里边去,然后是自动排好序的,每一个数列前边都会有 ...

  3. HBase入门

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  4. lintcode:哈希函数

    题目: 哈希函数 在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假 ...

  5. asp.net中当服务器出错时显示指定的错误页面

    http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...

  6. ios开发--清理缓存

    ios文章原文 一段清理缓存的代码如下: dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) , ...

  7. ARM(ARM处理器)

    ARM是微处理器行业的一家英国公司,其设计了大量高性能.廉价.耗能低的RISC处理器.相关技术及软件,公司并不直接生产产品,而是采用出售芯片技术授权的商业模式盈利.技术具有性能高.成本低和能耗省特点. ...

  8. Hibernate--基本映射标签和属性介绍

    一.映射文件的基本结构举例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hiberna ...

  9. Linux文件与进程的Capability简介

    UID这种权限机制颗粒太粗,容易引起权利过剩(溢出),Linux引入了Capability:每个Capability系统内以一位Bit代表,OS内部使用64bit存储. 下面是android的capa ...

  10. Jeally Bean中MonekyRunner 帮助文件

    基于4.2的SDK导出来的MonkeyRunner的最新帮助,这个版本对MonkeyView和MonkeyRect有了很大的加强,在MonkeyRunner的易用性上有了很大的提高. 对于导出Monk ...