BZOJ1924 tarjan+拓扑序
来源:互联网 发布:python bloomfilter 编辑:程序博客网 时间:2024/06/06 18:29
先按题目要求连边 缩点之后建反向图按拓扑序转移
#include<bits/stdc++.h>#define bug(x) cout<<(#x)<<" "<<(x)<<endl#define ll long long#define cal(x,y) (x-1)*c+yusing namespace std;const int N=1e5+5;const int M=1e6+5;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}ll n,r,c,cnt,tot=1,zjq,ans,id,flag,top; int head[N],bel[N],sz[N],sum[N],in[N],dfn[N],low[N],q[N],fx[]={-1,-1,-1,1,1,1,0,0},fy[]={-1,0,1,-1,0,1,1,-1};bool vis[N];vector<int>vx[M],vy[M];map<ll,int>mp;queue<int>s;struct node{ int x,y,t;}a[N*2];struct Edge{ int v,nxt;}e[M*4];void add(int u,int v){ e[++tot].v=v,e[tot].nxt=head[u],head[u]=tot,in[v]+=flag;}void tarjan(int x){ dfn[x]=low[x]=++id;vis[x]=1;q[++top]=x; for(int i=head[x];i;i=e[i].nxt){ int j=e[i].v; if(!dfn[j]) tarjan(j),low[x]=min(low[x],low[j]); else if(vis[j]) low[x]=min(low[x],dfn[j]); } if(low[x]==dfn[x]){ ++cnt; do{// cout<<q[top]<<" "; vis[q[top]]=0; bel[q[top]]=cnt; ++sz[cnt]; }while(q[top--]!=x);// cout<<endl; }}void rebuild(){ flag=tot=1;memset(head,0,sizeof head);memset(e,0,sizeof e); for(int p=1;p<=n;p++){ if(a[p].t==1){ for(int i=0;i<vx[a[p].x].size();i++) if(bel[vx[a[p].x][i]]!=bel[p]) add(bel[vx[a[p].x][i]],bel[p]); } if(a[p].t==2){ for(int i=0;i<vy[a[p].y].size();i++) if(bel[vy[a[p].y][i]]!=bel[p]) add(bel[vy[a[p].y][i]],bel[p]); } if(a[p].t==3) for(int i=0;i<8;i++){ ll cx=a[p].x+fx[i],cy=a[p].y+fy[i]; if(cx>r||cx<=0||cy>c||cy<=0) continue; ll tmp=(ll)cal(cx,cy); if(mp.count(tmp)){ int tt=mp[tmp]; if(bel[p]!=bel[tt]) add(bel[tt],bel[p]); } } }} void solve(){ for(int i=1;i<=cnt;i++) if(!in[i]) s.push(i),sum[i]=sz[i]; while(!s.empty()){ int x=s.front();s.pop(); for(int i=head[x];i;i=e[i].nxt){ int j=e[i].v; sum[j]=max(sum[j],sz[j]+sum[x]); --in[j]; if(!in[j]) s.push(j); } } for(int i=1;i<=cnt;i++) ans=max(ans,(ll)sum[i]); printf("%lld\n",ans);}int main(){#ifdef Devil_Gary freopen("in.txt","r",stdin);#endif n=read(),r=read(),c=read(); for(int i=1;i<=n;i++){ a[i].x=read(),a[i].y=read(),a[i].t=read(); mp[cal(a[i].x,a[i].y)]=i; vx[a[i].x].push_back(i); vy[a[i].y].push_back(i); } for(int p=1;p<=n;p++){ if(a[p].t==1){ for(int i=0;i<vx[a[p].x].size();i++) if(vx[a[p].x][i]!=p) add(p,vx[a[p].x][i]); } if(a[p].t==2){ for(int i=0;i<vy[a[p].y].size();i++) if(vy[a[p].y][i]!=p) add(p,vy[a[p].y][i]); } if(a[p].t==3) for(int i=0;i<8;i++){ ll cx=a[p].x+fx[i],cy=a[p].y+fy[i]; if(cx>r||cx<=0||cy>c||cy<=0) continue; ll tmp=(ll)cal(cx,cy); if(mp.count(tmp)) add(p,mp[tmp]); } } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); rebuild(); solve(); return 0; }
阅读全文
0 0
- BZOJ1924 tarjan+拓扑序
- 【codevs2131】【BZOJ1924】所驼门王的宝藏,tarjan+拓扑DP
- [BZOJ1924][SDOI2010]所驼门王的宝藏(Tarjan+拓扑排序)
- bzoj1924 [Sdoi2010]所驼门王的宝藏(tarjan缩点+拓扑排序+dp)
- 【bzoj1924】[Sdoi2010]所驼门王的宝藏(tarjan+STL+dp)
- [Tarjan缩点 拓扑序DP] SRM 499 1000pts
- [BZOJ2208][Jsoi2010]连通数(dfs||tarjan+拓扑序+dp)
- 最优贸易-tarjan+拓扑更新
- bzoj 3887 tarjan+拓扑排序
- BZOJ 1194 HNOI2006 潘多拉的盒子 BFS+Tarjan+拓扑序DP
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- 【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
- bzoj 1565: [NOI2009]植物大战僵尸 (最大权闭合子图+tarjan+拓扑序)
- bzoj 2707: [SDOI2012]走迷宫 (高斯消元+概率期望+tarjan缩点+拓扑序)
- CF894E Ralph and Mushrooms(tarjan缩点+拓扑序dp+数学)
- poj 2762 tarjan+缩点+拓扑排序
- UOJGraph(tarjan缩点+拓扑)
- BZOJ 2206 缩圈+拓扑[tarjan模板]
- Python读写文件模式和文件对象方法
- Vue.directive 自定义指令
- java集合框架
- 动态规划的典型分析与代码实现----主java
- Microsoft's AI-powered app can help you learn Chinese
- BZOJ1924 tarjan+拓扑序
- Problem M 在数组中查找指定元素 函数
- oracle存储过程加密
- echcache 帮助文档
- 机器学习与深度学习最好的解释
- ToastUtils工具类
- [SIM]MT6572在研发过程中,突然不识别SIM2
- 迪米特法则
- 表单写法备份(Zorro)