1924: [Sdoi2010]所驼门王的宝藏
来源:互联网 发布:淘宝网怎么没有一淘了 编辑:程序博客网 时间:2024/05/16 19:46
题意
不想写了。。
题解
一开始想拆点,然后费用流。。
然后发现环很难搞。。
果断弃疗。。
于是想到要是是环的话,缩点是肯定可以的。。
然后我们就随便dfs一下就好了。。
CODE:
#include<cstdio>#include<map>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int MAX=1<<30;const int N=100005;const int M=1000005;int n,r,c;int X[N],Y[N],C[N];map<int,map<int,int> > m;struct qq{ int x,y,last;}s[N*10];int num,last[N];int xx[8]={-1,-1,-1,0,0,1,1,1};int yy[8]={-1,0,1,-1,1,-1,0,1};void init (int x,int y){ num++; s[num].x=x;s[num].y=y; s[num].last=last[x]; last[x]=num;}int A[M],B[M];int dfn[N],low[N],belong[N],cnt,sta[N],lalal,shen;bool in[N];int TT[N];int mymin (int x,int y){return x<y?x:y;}int mymax(int x,int y){return x>y?x:y;}void dfs1 (int x){ dfn[x]=low[x]=++lalal; sta[++cnt]=x; in[x]=true; for (int u=last[x];u!=-1;u=s[u].last) { int y=s[u].y; if (dfn[y]==-1) { dfs1(y); low[x]=mymin(low[x],low[y]); } else if (in[y]) low[x]=mymin(dfn[y],low[x]); } if (low[x]==dfn[x]) { shen++;TT[shen]=0; int now; do { now=sta[cnt--]; belong[now]=shen; in[now]=false; TT[shen]++; }while (now!=x); }}int f[N];int dfs (int x){ if (f[x]!=0) return f[x]; f[x]=TT[x]; for (int u=last[x];u!=-1;u=s[u].last) { int y=s[u].y; f[x]=mymax(f[x],TT[x]+dfs(y)); } return f[x];}int main(){ num=0;memset(last,-1,sizeof(last)); memset(A,-1,sizeof(A)); memset(B,-1,sizeof(B)); scanf("%d%d%d",&n,&r,&c); for (int u=1;u<=n;u++) { scanf("%d%d%d",&X[u],&Y[u],&C[u]); m[X[u]][Y[u]]=u; if (A[X[u]]==-1&&C[u]==1) A[X[u]]=u; if (B[Y[u]]==-1&&C[u]==2) B[Y[u]]=u; } for (int u=1;u<=n;u++) { if (A[X[u]]!=-1) init(A[X[u]],u); if (B[Y[u]]!=-1) init(B[Y[u]],u); if (C[u]==3) { for (int i=0;i<=8;i++) { int fx=X[u]+xx[i],fy=Y[u]+yy[i]; if (m.count(fx)!=0&&m[fx].count(fy)!=0) init(u,m[fx][fy]); } } if (C[u]==2&&B[Y[u]]!=-1) init(u,B[Y[u]]); if (C[u]==1&&A[X[u]]!=-1) init(u,A[X[u]]); } shen=lalal=cnt=0; memset(dfn,-1,sizeof(dfn)); memset(in,false,sizeof(in)); for (int u=1;u<=n;u++) if (dfn[u]==-1) dfs1(u); int num1=num;memset(last,-1,sizeof(last));num=0; for (int u=1;u<=num1;u++) if (belong[s[u].x]!=belong[s[u].y]) init(belong[s[u].x],belong[s[u].y]); int ans=0; for (int u=1;u<=shen;u++) ans=mymax(ans,dfs(u)); printf("%d\n",ans); return 0;}
阅读全文
0 0
- 1924: [Sdoi2010]所驼门王的宝藏
- 1924: [Sdoi2010]所驼门王的宝藏
- [BZOJ]1924: [Sdoi2010]所驼门王的宝藏 强连通+DP
- 【SDOI2010】【BZOJ1924】所驼门王的宝藏
- BZOJ1924: [Sdoi2010]所驼门王的宝藏
- BZOJ1924: [Sdoi2010]所驼门王的宝藏
- bzoj1924 [Sdoi2010]所驼门王的宝藏
- bzoj1924: [Sdoi2010]所驼门王的宝藏
- 【BZOJ1924】【SDOI2010】所驼门王的宝藏
- 【bzoj1924】【SDOI2010】所驼门王的宝藏
- 省选专练SDOI2010所驼门王的宝藏
- [BZOJ1924][SDOI2010]所驼门王的宝藏(Tarjan+拓扑排序)
- 【bzoj1924】[Sdoi2010]所驼门王的宝藏(tarjan+STL+dp)
- [SDOI2010]所驼门王的宝藏 --tarjan缩点+最长路
- BZOJ 1924 [Sdoi2010]所驼门王的宝藏 tarjan缩点+拓扑DP
- 1924: [Sdoi2010]所驼门王的宝藏 tarjan缩点+dp最长路
- bzoj 1924: [Sdoi2010]所驼门王的宝藏 (tarjan缩点+spfa)
- [SDOI2010]BZOJ 1924所驼门王的宝藏-强连通分量-缩点-拓扑排序-dp
- CCF——数列分段
- 双系统安装,先linux后,windows 10.
- SpringBoot开发微信点餐系统笔记--介绍
- 设计模式——六大原则详细
- Spring Transactional
- 1924: [Sdoi2010]所驼门王的宝藏
- quartz详细介绍
- 如何搭建Zookeeper集群
- OpenCV 3.3.0中DNN模块测试记录
- 为什么要有一个好的架构
- 权限管理--权限资源管理
- mybatis学习之路----模糊查询实现
- 那些年开发通知栏遇到的坑
- ORACLE基本数据类型总结