【Apio2009】Bzoj1179 Atm
2016-09-20 19:54
417 查看
【Apio2009】Bzoj1179 Atm
Position:http://www.lydsy.com/JudgeOnline/problem.php?id=1179
List
Apio2009Bzoj1179 AtmList
Description
Input
Output
Sample Input
Sample Output
HINT
Solution
Code
Dfs
记忆化搜索
Description
Input
第一行包含两个整数N、M。N表示路口的个数,M表示道路条数。接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号。接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数。接下来一行包含两个整数S、P,S表示市中心的编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有P个整数,表示P个有酒吧的路口的编号Output
输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数。Sample Input
6 71 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1
5
1 4
4 3 5 6
Sample Output
47HINT
50%的输入保证N, M<=3000。所有的输入保证N, M<=500000。每个ATM机中可取的钱数为一个非负整数且不超过4000。输入数据保证你可以从市中心沿着Siruseri的单向的道路到达其中的至少一个酒吧。Solution
先Tarjian缩点,变成一个DAG(有向无环图)不会Tarjan Algorithm的传送门接下来就好做了:
1. Dfs直接上,虽然Bzoj不会卡你,可今天考试丧心病狂的数据把我卡成了90
2. 记忆化搜索,f[x]记录从x走到尾的最大抢钱数,下次再走到这点就可以直接调用,还是比dfs快蛮多。
3. 也可以跑最短路(Spfa or Dijstra)
Code
Dfs
// <atm.cpp> - Tue Sep 20 08:15:49 2016 // This file is made by YJinpeng,created by XuYike's black technology automatically. // Copyright (C) 2016 ChangJun High School, Inc. // I don't know what this program is. #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define MOD 1000000007 #define INF 1e9 using namespace std; typedef long long LL; const int MAXN=100010; const int MAXM=100010; inline int max(int &x,int &y) {return x>y?x:y;} inline int min(int &x,int &y) {return x<y?x:y;} inline int gi() { register int w=0,q=0;register char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')q=1,ch=getchar(); while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar(); return q?-w:w; } struct Tarjan{ static const int N=500010,M=500010; int n,m,be,tot,_clock,scc; int ne[M],to[M];bool in ;vector<int>p ; int bar ,fr ,low ,dfn ,f ,st ,s ,ss ; void add(int u,int v){ to[++tot]=v;ne[tot]=fr[u];fr[u]=tot; } void Init(){ n=gi(),m=gi(); for(int i=1;i<=m;i++){ int u=gi(),v=gi();add(u,v); } for(int i=1;i<=n;i++)ss[i]=gi(); be=gi(),m=gi(); for(int i=1;i<=m;i++)bar[i]=gi(); } inline void dfs(int x){ dfn[x]=low[x]=++_clock; st[++tot]=x;in[x]=true; for(int o=fr[x];o;o=ne[o]) if(!dfn[to[o]])dfs(to[o]),low[x]=min(low[x],low[to[o]]); else if(in[to[o]])low[x]=min(low[x],low[to[o]]); if(dfn[x]==low[x]){ scc++; while(st[tot]!=x){ f[st[tot]]=scc;in[st[tot]]=false;tot--; } f[x]=scc;in[x]=false;tot--; } } void src(int x,int now){ if(now<=f[x])return;f[x]=now; int to=p[x].size(); for(int i=0;i<to;i++) src(p[x][i],now+s[p[x][i]]); } void Work(){ _clock=tot=scc=0; memset(dfn,0,sizeof(dfn)); memset(in,false,sizeof(in)); for(int i=1;i<=n;i++) if(!dfn[i])dfs(i); for(int i=1;i<=n;i++)s[f[i]]+=ss[i]; for(int i=1;i<=n;i++) for(int o=fr[i];o;o=ne[o]){ if(f[i]==f[to[o]])continue; p[f[i]].push_back(f[to[o]]); } for(int i=1;i<=m;i++)bar[i]=f[bar[i]]; be=f[be];memset(f,0,sizeof(f)); src(be,s[be]);int ans=0; for(int i=1;i<=m;i++)ans=max(ans,f[bar[i]]); printf("%d",ans); } }Tar; int main() { freopen("atm.in","r",stdin); freopen("atm.out","w",stdout); Tar.Init();Tar.Work(); return 0; }
记忆化搜索
// <atm.cpp> - Tue Sep 20 08:15:49 2016 // This file is made by YJinpeng,created by XuYike's black technology automatically. // Copyright (C) 2016 ChangJun High School, Inc. // I don't know what this program is. #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define MOD 1000000007 #define INF 1e9 using namespace std; typedef long long LL; const int MAXN=100010; const int MAXM=100010; inline int max(int &x,int &y) {return x>y?x:y;} inline int min(int &x,int &y) {return x<y?x:y;} inline int gi() { register int w=0,q=0;register char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')q=1,ch=getchar(); while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar(); return q?-w:w; } struct Tarjan{ static const int N=500010,M=500010; int n,m,be,tot,_clock,scc; int ne[M],to[M];bool in ;vector<int>p ; int bar ,fr ,low ,dfn ,f ,st ,s ,ss ; void add(int u,int v){ to[++tot]=v;ne[tot]=fr[u];fr[u]=tot; } void Init(){ n=gi(),m=gi(); for(int i=1;i<=m;i++){ int u=gi(),v=gi();add(u,v); } for(int i=1;i<=n;i++)ss[i]=gi(); be=gi(),m=gi(); for(int i=1;i<=m;i++)bar[i]=gi(); } inline void dfs(int x){ dfn[x]=low[x]=++_clock; st[++tot]=x;in[x]=true; for(int o=fr[x];o;o=ne[o]) if(!dfn[to[o]])dfs(to[o]),low[x]=min(low[x],low[to[o]]); else if(in[to[o]])low[x]=min(low[x],low[to[o]]); if(dfn[x]==low[x]){ scc++; while(st[tot]!=x){ f[st[tot]]=scc;in[st[tot]]=false;tot--; } f[x]=scc;in[x]=false;tot--; } } inline int src(int x){//let every node just go once if(in[x])return f[x];in[x]=true; int to=p[x].size(); for(int i=0;i<to;i++) f[x]=max(f[x],src(p[x][i])); if(f[x]||st[x])f[x]+=s[x]; return f[x]; } void Work(){ _clock=tot=scc=0; memset(dfn,0,sizeof(dfn)); memset(in,false,sizeof(in)); for(int i=1;i<=n;i++) if(!dfn[i])dfs(i); for(int i=1;i<=n;i++)s[f[i]]+=ss[i]; for(int i=1;i<=n;i++) for(int o=fr[i];o;o=ne[o]){ if(f[i]==f[to[o]])continue; p[f[i]].push_back(f[to[o]]); } memset(st,0,sizeof(st));memset(in,0,sizeof(0)); for(int i=1;i<=m;i++)bar[i]=f[bar[i]],st[bar[i]]=1; be=f[be];memset(f,0,sizeof(f)); printf("%d",src(be)); } }Tar; int main() { freopen("atm.in","r",stdin); freopen("atm.out","w",stdout); Tar.Init();Tar.Work(); return 0; }
相关文章推荐
- bzoj1179: [Apio2009]Atm(强联通+最短路)
- [BZOJ1179][Apio2009]Atm(tarjan+spfa)
- 【BZOJ】1179 [Apio2009]Atm 强连通分量+最短路
- bzoj 1179 [Apio2009]Atm tarjan强联通缩点+SPFA
- bzoj1179 [Apio2009]Atm(tarjan缩点+spfa)
- 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
- bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
- 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)
- BZOJ 1179: [Apio2009]Atm
- bzoj 1179 [Apio2009]Atm tarjan+最长路
- 【bzoj1179】 Apio2009—Atm
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- BZOJ1179: [Apio2009]Atm
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
- 【bzoj1179】 Apio2009—Atm
- 【bzoj1179】[Apio2009]Atm
- [BZOJ1179]APIO2009 ATM |强联通分量|DP
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- BZOJ_1179_[Apio2009]Atm_tarjan+spfa