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 ...
随机推荐
- wed应用程序开发原理
---恢复内容开始--- 企业应用演变的模式 1.主机/哑终端的集中计算模式 时间二十世纪七十年代,企业应用程序是围绕一个中心大型主机建立的.特点 大,贵,专用.只有输入输出功能,没有处理能力,全部是 ...
- js,css小知识点记录
JS手册中提到:可以使用任意表达式作比较表达式.任何值为0.null.未定义或空字符串的表达式被解释为 false.其他任意值的表达式解释为 true.也就是说,这里会隐式的转换为布尔值. ...
- 99%的人都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- SSD Trim Support -- 保护 SSD
今天同事告诉我,换了 ssd 之后需要做以下配置能使 ssd 寿命更长.原理是配置系统定期清理和回收 ssd 的资源. 最终效果: 步骤: 1.下载 trim enabler: https://gis ...
- 点击input时,里面默认字体消失显示
点击input时,点击input里面默认字体消失显示: <input type="" name="" id="" value=&quo ...
- 转:HAR(HTTP Archive)规范
HAR(HTTP Archive),是一个用来储存HTTP请求/响应信息的通用文件格式,基于JSON.这个格式的出现可以使HTTP监测工具以一种通用的格式导出所收集的数据,这些数据可以被其他支持HAR ...
- idea使用心得(4)-踩过的坑
1.非法的表达式开始 / 需要';' / 未结束的字符串文字 表现形式: 原因/解决: 这个一定是文件编码问题:依次检查setting中的file Encodings 中的IDE ...
- JavaWeb三大组件——过滤器的运行机制理解
过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...
- Page in/Page out/Page fault
Paging refers to writing portions, termed pages, of a process' memory to disk. Swapping, strictly sp ...
- input固定在底部
// input固定在底部//isFocusing获取焦点:true 失去焦点:false _onTouchInput(isFocusing){ this.phone_width = screen.w ...