Father Christmas flymouse--POJ3160Tarjan
Father Christmas flymouse
Time Limit: 1000MS Memory Limit: 131072K
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
POJ Monthly–2006.12.31, Sempr
题意:Flymouse从武汉大学ACM集训队退役后,做起了志愿者,在圣诞节来临时,Flymouse要打扮成圣诞老人给集训队员发放礼物。集训队员住在校园宿舍的不同寝室,为了节省体力,Flymouse决定从某一个寝室出发,沿着有向路一个接一个的访问寝室并顺便发放礼物,直至能到达的所有寝室走遍为止。对于每一个寝室他可以经过无数次但是只能进入一次,进入房间会得到一个数值(数值可正可负),他想知道他能获得最大的数值和。
思路:对于一个有向图,图中的强连通一定可以相互抵达,所以Flymouse可以访问强连通分量中的任意元素,对于集合中的负值不要,只要正值就可以保证得到的值最大,所以我们将强连通缩点后形成一个DAG图,搜索一下就可以得到最大值。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>
using namespace std;
const int Max = 30010;
vector<int>Map[Max];
vector<int>G[Max];
vector<int>P[Max];
int va[Max]; //节点价值
int dfn[Max],low[Max],vis[Max],dep;//遍历的顺序,回溯,标记,遍历的顺序。
int pre[Max],num,a[Max];// 集合,数目,集合价值
stack<int>S;
int n,m;
void init() //初始化
{
for(int i=0;i<=n;i++)
{
Map[i].clear();
P[i].clear();
G[i].clear();
}
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
dep = 0 ; num = 0;
}
void Tarjan(int u)
{
dfn[u] = low[u] =dep++;
vis[u]=1;
S.push(u);
for(int i=0;i<Map[u].size();i++)
{
if(vis[Map[u][i]]==1)
{
low[u] = min(low[u],dfn[Map[u][i]]);
}
else if(vis[Map[u][i]]==0)
{
Tarjan(Map[u][i]);
low[u] = min(low[u],low[Map[u][i]]);
}
}
if(dfn[u]==low[u])
{
while(!S.empty()) //缩点
{
int v = S.top();
S.pop();
pre[v] = num;
vis[v] = 2;
a[num]+=va[v];
G[num].push_back(v);//记录集合的点
if(u==v)
{
break;
}
}
num++;
}
}
int dfs(int u)
{
if(!vis[u])
{
int ans = 0;
vis[u]=1;
for(int i=0;i<P[u].size();i++)
{
ans = max(ans,dfs(P[u][i]));
}
a[u] += ans ;
}
return a[u];
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
init();
for(int i=0;i<n;i++) //先输入价值
{
scanf("%d",&va[i]);
va[i]=va[i]<0?0:va[i];//小于零的归零,为不访问
}
int u,v;
for(int i=0;i<m;i++) //建图
{
scanf("%d %d",&u,&v);
Map[u].push_back(v);
}
for(int i=0;i<n;i++)//强连通缩点
{
if(vis[i]==0)//从未被遍历的点搜索
{
Tarjan(i);
}
}
for(int i=0;i<num;i++) //重新建图
{
memset(vis,0,sizeof(vis));
for(int j=0;j<G[i].size();j++)
{
int u=G[i][j];//集合中的点
for(int k=0;k<Map[u].size();k++)
{
if(pre[Map[u][k]] != i && !vis[pre[Map[u][k]]])
{
P[i].push_back(pre[Map[u][k]]);
vis[pre[Map[u][k]]] = 1;
}
}
}
}
int ans= 0 ;
memset(vis,0,sizeof(vis));
for(int i=0;i<num;i++)//搜索最大的值
{
ans = max(ans,dfs(i));
}
printf("%d\n",ans);
}
return 0;
}
Father Christmas flymouse--POJ3160Tarjan的更多相关文章
- POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3241 Accep ...
- POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3007 Accep ...
- Father Christmas flymouse
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3479 Accep ...
- L - Father Christmas flymouse
来源poj3160 After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ...
- poj 3160 Father Christmas flymouse
// 题目描述:从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,比如打扫集训用的机房等等.当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物.集 ...
- poj 3160 Father Christmas flymouse【强连通 DAG spfa 】
和上一道题一样,可以用DAG上的动态规划来做,也可以建立一个源点,用spfa来做 #include<cstdio> #include<cstring> #include< ...
- POJ——T3160 Father Christmas flymouse
Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3496 Accepted: 1191 缩点,然后每个新点跑一边SPFA ...
- POJ:3160-Father Christmas flymouse
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...
- 【转】Tarjan&LCA题集
转自:http://blog.csdn.net/shahdza/article/details/7779356 [HDU][强连通]:1269 迷宫城堡 判断是否是一个强连通★2767Proving ...
随机推荐
- vuejsLearn--- -- 怎么查看、修改、追加数据---->data对象
实例观察的数据对象.可以用一个新的对象替换.实例代理了它的数据对象的属 我们现在对data2添加几项 使用数组push()追加 但是直接这样不能进行数组操作 var data2 = { city: ' ...
- Windowns 10打开此电脑缓慢问题的一种解决办法
上个月刚配的台式,i7 6700K + 16GB + PM961用起来爽得不行. 不过最近两天突然发现,打开"此电脑"总会卡住,窗口里面也不显示磁盘.地址栏缓慢刷新. 一般此类问题 ...
- centos7系统管理和运维实战
centos7系统管理和运维实战 centos7安装配置 yum install -y net-tools >/etc/hostname echo "sqlserver01" ...
- Windows7+VirtualBox+Ubuntu本地开发环境搭建
首先下载相应的VirtualBox和Ubuntu镜像文件 安装Ubuntu操作系统 一 网络设置 将虚拟机的network连接模式设置为Bridge模式,注意无线网卡要与本机的无线网卡名称一致 在wi ...
- [原创] [YCM] YouCompleteMe安装完全指南
因为实在实在受不鸟ctags了: 代码中有很多类具有相同名字的变量, 比如 "id". 当我想看下当前的这个 "id" 到底是哪个id的时候, 可怕的事情粗线了 ...
- 3.Java Script 类型
true: null==undefinedfalse: null===undefined
- csuoj 1117: 网格中的三角形
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1117 1117: 网格中的三角形 Time Limit: 3 Sec Memory Limit: ...
- 最简单的jsp+servlet的增删改查代码
package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
- c++加法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...
- JAVA内存管理之堆内存和栈内存
我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆 ...