// 题目描述:
从武汉大学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. uva 11489

    简单博弈 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...

  2. 解决unity3d发布的网页游戏放到服务器上无法使用的问题

    http://www.unity蛮牛.com/blog-2429-1226.html 第一次把unity3d发布的网页游戏放到服务器上(Win2003),发现无法使用.可以尝试以下办法.       ...

  3. Unity3D脚本中文系列教程(三)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302323886/ Unity3D脚本中文系列教程(二) 示,属性不被序列化或显示 ...

  4. C#三种定时器的实现

    http://www.coridc.com/archives/2253.html c#中提供了三种类型的计时器: 1.基于 Windows 的标准计时器(System.Windows.Forms.Ti ...

  5. G家二面

    题目都很基本,都属于听说过但是不会做的…都是操作系统,compiler的概念题… 概念题郁闷就郁闷在不会就是不会,就算能扯两句也会被问倒… 算法就一个,pow(x, y),5分钟不到…… 不是听说G家 ...

  6. git init 与 git init --bare 的区别

    git init  和 git init –bare 的区别 使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repos ...

  7. 什么是spring?

    一.对spring的理解. 1.Spring是实现了工厂模式的工厂类(什么是工厂类?简单的来说就是把需要的接口定义到一个类中,需要的时候不用新建,直接从这个类中调用该接口就可以了), 这个类的名字为B ...

  8. 源代码Log

    MVC5源代码 https://github.com/aspnet/Mvc MVC4源代码 http://aspnetwebstack.codeplex.com/

  9. managedQuery和query的区别,

    我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时 ...

  10. Django 大文件下载

    django提供文件下载时,若果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入Response对象中: def simple_file_download(request): # ...