Description

Input

第一行给出三个正整数 N, R, C。 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti。Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“ziyoumen”。 保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。

Output

只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。

Sample Input

10 7 7
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1

Sample Output

9

【思路】

构图,SCC,DP

因为只有宝藏室有门所以传送到空房间是没有意义的,这样可以将n个宝藏室构图。

求出SCC,对于一个SCC内的任意节点可以互相到达而到达次数没有限制,所以缩点,将点权设为SCC的结点数,这样问题就变成了求DAG上的一条最大点权路,可以用DP求解。

需要注意的是DAG不一定连通。

  

【代码】

 #include<set>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int N = *1e5+;
struct Node{
int x,y,id;
bool operator < (const Node& rhs) const{
return x<rhs.x || (x==rhs.x&&y<rhs.y);
}
};
void read(int& x) {
char c=getchar(); int f=; x=;
while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
while(isdigit(c)) x=x*+c-'',c=getchar();
x*=f;
}
int n,R,C,val[N],f[N],x[N],y[N],z[N],in[N];
vector<int> g[N],G[N],quex[N],quey[N];
int dfsc,pre[N],lowlink[N],sccno[N],scccnt;
stack<int> S; set<Node> xy; void dfs(int u) {
pre[u]=lowlink[u]=++dfsc;
S.push(u);
FOR(i,,(int)g[u].size()-) {
int v=g[u][i];
if(!pre[v]) {
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccno[v]) {
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]) {
++scccnt;
for(;;) {
int x=S.top(); S.pop();
sccno[x]=scccnt;
if(x==u) break;
}
}
} int dp(int u) {
int& ans=f[u];
if(ans) return ans;
FOR(i,,(int)G[u].size()-)
ans=max(ans,dp(G[u][i]));
ans+=val[u];
return ans;
} void get_graph() {
FOR(i,,n) {
read(x[i]),read(y[i]),read(z[i]);
quex[x[i]].push_back(i),quey[y[i]].push_back(i);
xy.insert((Node){x[i],y[i],i});
}
FOR(i,,n) {
if(z[i]==) {
FOR(j,,(int)quex[x[i]].size()-)
if(i!=quex[x[i]][j]) g[i].push_back(quex[x[i]][j]);
}
else if(z[i]==) {
FOR(j,,(int)quey[y[i]].size()-)
if(i!=quey[y[i]][j]) g[i].push_back(quey[y[i]][j]);
} else {
FOR(dx,-,) FOR(dy,-,) if(dx!=||dy!=) {
int xx=x[i]+dx,yy=y[i]+dy;
Node u=*xy.find((Node){xx,yy,});
if(u.x==xx&&u.y==yy) g[i].push_back(u.id);
}
}
}
} int main() {
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
read(n),read(R),read(C);
get_graph();
FOR(i,,n) if(!pre[i]) dfs(i);
FOR(u,,n) {
val[sccno[u]]++;
FOR(j,,(int)g[u].size()-) {
int v=g[u][j];
if(sccno[v]!=sccno[u]) {
in[sccno[v]]++;
G[sccno[u]].push_back(sccno[v]);
}
}
}
int ans=;
FOR(i,,scccnt)
if(!in[i]) ans=max(ans,dp(i));
printf("%d\n",ans);
}

ps:万万没想到,bokeyuan竟然和谐free gate

bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)的更多相关文章

  1. [BZOJ 1924][Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1285  Solved: 574[Submit][Sta ...

  2. BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】

    Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...

  3. 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  4. 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)

    [题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...

  5. [SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  6. [LuoguP2403][SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  7. 洛谷 2403 [SDOI2010] 所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”.所驼门王毕生致力于维护家族的安定与和谐, ...

  8. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...

  9. BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP

    记住:map一定要这么用: if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy ...

随机推荐

  1. nginx禁止目录php执行权限

    nginx禁止目录php执行权限,找到配置fastcgi.conf文件,一般在/usr/local/nginx/conf/下面,修改如下 location ~* ^/(data|uploads|tem ...

  2. ecshop会员中心增加订单搜索功能

    在user.php中的act=order_list中增加以下程序. $order_sn = isset($_REQUEST['order_sn'])?$_REQUEST['order_sn']:''; ...

  3. 13个Cat命令管理(显示,排序,建立)文件实例

    在Linux系统中,大多数配置文件.日志文件,甚至shell脚本都使用文本文件格式,因此,Linux系统存在着多种文本编辑器,但当你仅仅想要查看一下这些文件的内容时,可使用一个简单的命令-cat. c ...

  4. E8.Net工作流平台开发篇

    E8.Net开发篇(一)   E8.Net开发框架有哪些源程序模型? E8.Net开发框架为开发企业流程应用系统提供了最佳实践的开发架构.范例及源代码,包括待办事项的组织.流程启动模型.处理模型.母版 ...

  5. 【Scala 】Akka库

    简介编辑 Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.9 ...

  6. javascript随手记

    编码规范 避免使用全局变量 写在所有函数外面的变量就是全局变量. 之所以要避免使用全局变量是因为:如果有多个类库的话,它们都定义了一个名字的变量.这时候后引入的类库中该变量的值就会覆盖前面引入的类库中 ...

  7. .bat批处理脚本让cmd命令行提示符cd到工作目录 (转)

    打开cmd,检查命令行提示符所在的默认位置(目录),进入该目录用notepad++创建一个文件,输入 @echo offrem 这个符号表示该行是注释.rem 进入f盘,需要先切换盘符,成功后才能进入 ...

  8. js 字符串扩展

    <script type="text/javascript" language="javascript"> String.prototype.tri ...

  9. YCbCr

    http://blog.csdn.net/shizhixin/article/details/4494358 YCbCr 则是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一 ...

  10. MySQL 性能调优的10个方法

    Mysql的优化方面,一般我们很少去考虑它,即使想到优化一般也更多是程序级别的,比如不要写过于消耗资源的SQL语句,但是除此以外,在整个系统上其实仍然有很多可以优化的地方. 1. 选择合适的存储引擎: ...