題目傳送門
這道題苟了我好久,因為鍊錶的記憶體問題,之後再細講。
首先這是一道tarjan+dag上dp的題目。
有三種門,對於每種門可以和其他門相連。即連邊。
使用鍊錶快速查詢連邊。
建完圖後可以進行tarjan縮點。
然後做一遍dag上dp就好了。(記搜)
然後因為建圖時會有很多條邊,而行列最多只有100000個,所以要分開定義。
不然會爆記憶體。
code:
#include #include#include
using
namespace
std;
intread()
int n,r,c,x,y,fx,fy,o,a[100005][4
];struct
list
void add(int x,int
y)}m,nm;
struct
list2
void add(int x,int
y)}a,b;
int dfn[100005],low[100005],stack[100005],top,cnt,vis[100005],fa[100005
];int otk[100005],f[100005],sk[100005
],ans;
void tarjan(int
now)
if(dfn[now]==low[now])
return;}
int dfs(int
now)
f[now]+=sk[now];
ans=max(ans,f[now]);
return
f[now];
}int
main()
for(i=1;i<=n;i++)}}
for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
memset(vis,
0,sizeof
vis);
for(i=1;i<=n;i++)}}
for(i=1;i<=n;i++)
for(j=m.head[i];j!=-1;j=m.nxt[j])
if(fa[i]!=fa[m.to[j]])nm.add(fa[i],fa[m.to[j]]);
memset(vis,
0,sizeof
vis);
for(i=1;i<=n;i++)
if(!otk[fa[i]]&&!vis[fa[i]])
dfs(i);
printf("%d
",ans);
return0;
}
vector版傳送門
bzoj 1924 所駝門王的寶藏
題目大意 有乙個r c的矩陣,上面有n個點有寶藏 每個有寶藏的點上都有傳送門 傳送門有三種 第一種可以傳到該行任意乙個有寶藏的點,第二種可以傳到該列任意乙個有寶藏的點,第三種可以傳到周圍的八連塊上有寶藏的點 現在你可以在任意乙個有寶藏的點開始,求你最多可以經過多少個不同的藏寶點 每個藏寶點可以多次進...
BZOJ 1924 所駝門王的寶藏 縮點 最短路
給出乙個1e6 1e6 1e6 1e6 1e6 1e 6的矩形,矩形中有三種傳送門,分別是傳送這一行的任意乙個傳送門,或者傳送到這一列的任意乙個傳送門,或者是傳送附近8 88個位置的任意乙個傳送門。然後你可以選擇並且只能選擇從任何乙個傳送門進入,從任何乙個傳送門出來。求經過最多的點的個數是多少。預處...
BZOJ 1924 Sdoi2010 所駝門的寶藏
time limit 5 sec memory limit 128 mb submit 1380 solved 603 submit status discuss 第一行給出三個正整數 n,r,c。以下 n 行,每行給出一扇傳送門的資訊,包含三個正整數xi,yi,ti,表示該傳送門設在位於第 xi行...