poj 3160 Father Christmas flymouse【强连通 DAG spfa 】
和上一道题一样,可以用DAG上的动态规划来做,也可以建立一个源点,用spfa来做
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std; const int maxn = ;
int n,m;
int first[maxn];
int sc[maxn],scn[maxn],low[maxn],pre[maxn];
int scnt,ecnt,dfs_clock;
int dp[maxn]; int first1[maxn];
int ecnt1; int a[maxn];
int in[maxn]; struct Edge{
int v,next;
}e[maxn*]; Edge e1[maxn*]; stack<int> S; void init(){
ecnt = ecnt1 = ;
memset(first,-,sizeof(first));
memset(first1,-,sizeof(first1));
memset(dp,,sizeof(dp));
} void addedges(int u,int v){
e[ecnt].v = v;
e[ecnt].next = first[u];
first[u] = ecnt++;
} void addedges1(int u,int v){
e1[ecnt1].v = v;
e1[ecnt1].next = first1[u];
first1[u] = ecnt1++;
} void dfs(int u){
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(!sc[v]) low[u] = min(low[u],pre[v]);
}
if(pre[u] == low[u]){
scnt++;
for(;;){
int x = S.top();S.pop();
sc[x] = scnt;
scn[scnt]+= a[x];
if(x == u) break;
}
}
} void find_scc(){
while(!S.empty()) S.pop();
scnt = dfs_clock = ;
memset(low,,sizeof(low));memset(pre,,sizeof(pre));
memset(sc,,sizeof(sc));memset(scn,,sizeof(scn)); for(int i = ;i <= n;i++) if(!pre[i]) dfs(i);
} int solve(int p){
if(dp[p]) return dp[p];
for(int i = first1[p];~i;i = e1[i].next){
int v = e1[i].v;
dp[p] = max(dp[p],solve(v));
}
return dp[p] = dp[p] + scn[p];
} int main(){
int T;
while(scanf("%d %d",&n,&m) != EOF){
init();
for(int i = ;i <= n;i++) {
scanf("%d",&a[i]);
if(a[i] < ) a[i] = ;
}
for(int i = ;i < m;i++ ){
int u,v;
scanf("%d %d",&u,&v);u++;v++;
addedges(u,v);
}
find_scc(); memset(in,,sizeof(in));
for(int u = ;u <= n;u++){
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(sc[u] != sc[v]) addedges1(sc[u],sc[v]),in[sc[v]]++;
}
} int ans = ;
for(int i = ;i <= scnt;i++) {
ans = max(ans,solve(i));
}
printf("%d\n",ans);
}
return ;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
using namespace std; const int maxn = ;
const int INF = ;
int n,m;
int first[maxn];
int sc[maxn],scn[maxn],low[maxn],pre[maxn];
int scnt,ecnt,dfs_clock;
int dp[maxn]; int du[maxn];
int dis[maxn];
int inq[maxn]; int first1[maxn];
int ecnt1; struct Edge{
int v,next;
}e[maxn*]; Edge e1[maxn*]; stack<int> S;
vector<int> g[maxn];
int val[maxn],a[maxn]; void init(){
ecnt = ecnt1 = ;
memset(first,-,sizeof(first));
memset(val,,sizeof(val));
memset(du,,sizeof(du));
} void addedges(int u,int v){
e[ecnt].v = v;
e[ecnt].next = first[u];
first[u] = ecnt++;
} void dfs(int u){
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(!sc[v]) low[u] = min(low[u],pre[v]);
}
if(pre[u] == low[u]){
scnt++;
for(;;){
int x = S.top();S.pop();
sc[x] = scnt;
val[scnt] += a[x];
if(x == u) break;
}
}
} void find_scc(){
while(!S.empty()) S.pop();
scnt = dfs_clock = ;
memset(low,,sizeof(low));memset(pre,,sizeof(pre));
memset(sc,,sizeof(sc));memset(scn,,sizeof(scn)); for(int i = ;i <= n;i++) if(!pre[i]) dfs(i);
} int spfa(){
memset(inq, , sizeof(inq));
queue<int>q;
g[].clear();
q.push();
dis[] = ; val[] = ;
for(int i = ; i <= scnt; i++){if(du[i] == )g[].push_back(i); dis[i] = -INF;}
int ans = ;
while(!q.empty()){
int u = q.front(); q.pop(); inq[u] = ;
for(int i = ; i < g[u].size(); i++){
int v = g[u][i];
if(dis[v] < dis[u] + val[v]){
dis[v] = dis[u] + val[v];
ans = max(ans, dis[v]);
if(inq[v] == )inq[v] = , q.push(v);
}
}
}
return ans;
} int main(){
while(scanf("%d %d",&n,&m) != EOF){
init();
for(int i = ;i <= n;i++) {
scanf("%d",&a[i]);
if(a[i] < ) a[i] = ;
}
for(int i = ;i < m;i++ ){
int u,v;
scanf("%d %d",&u,&v);u++;v++;
addedges(u,v);
}
find_scc();
for(int i = ;i <= scnt;i++) g[i].clear(); for(int u = ;u <= n;u++){
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(sc[u] != sc[v]) g[sc[u]].push_back(sc[v]),du[sc[v]]++;
}
}
printf("%d\n",spfa());
}
return ;
}
poj 3160 Father Christmas flymouse【强连通 DAG spfa 】的更多相关文章
- poj 3160 Father Christmas flymouse
// 题目描述:从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,比如打扫集训用的机房等等.当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物.集 ...
- POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3007 Accep ...
- POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3241 Accep ...
- POJ——T3160 Father Christmas flymouse
Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3496 Accepted: 1191 缩点,然后每个新点跑一边SPFA ...
- Father Christmas flymouse
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3479 Accep ...
- POJ:3160-Father Christmas flymouse
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...
- L - Father Christmas flymouse
来源poj3160 After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ...
- Father Christmas flymouse--POJ3160Tarjan
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...
- POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n. ...
随机推荐
- jQuery添加新的元素
append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 $(&quo ...
- c++ 优先级队列(priority_queue)
从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在 ...
- linux内核内存分配(一、基本概念)
内存分配是Linux比较复杂也是比较重要的部分,这个和ssd驱动很类似:物理地址和虚拟地址的映射关系.下面总结下最近看到的有关内存分配的内容和自己的理解: 1.一致内存访问和非一致内存访问 上图来自& ...
- 训练1-Y
对于给定的一个字符串,统计其中数字字符出现的次数. Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串 Output 对于每个测试实 ...
- Mysql和网络连接相关的参数介绍
摘要:同时还需要注意OS级别的网络监听队列的限制.因为如果OS的网络监听设置小于mysql的back_log设置的时候,我们加大back_log是没有意义的... max_conecctions:整个 ...
- Java的五大原则
五个基本原则: 单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化.单一职责原则可以看做是低耦合.高内聚在面向对象原则上的引申, ...
- Libevent学习笔记
学习: /Users/baidu/Documents/Data/Interview/服务器-检索端/libevent参考手册(中文版).pdf 讲的不好.翻译的..
- 具体解释Redis源代码中的部分高速排序算法(pqsort.c)
看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...
- 【Android 初学】13、Broadcast Receiver
Broadcast Receiver Android广播机制包括三个基本要素:广播(Broadcast) - 用于发送广播.广播接收器(BroadcastReceiver) - 用于接收广播:意图内容 ...
- 移除apsx视图引擎,及View目录下的web.config的作用
<> 使用Rezor视图引擎的时候移除apsx视图引擎 Global.asax文件 using System; using System.Collections.Generic; usin ...