[dfs树]「CEOI 2017」One-Way Streets
来源:互联网 发布:新奔腾预算软件 编辑:程序博客网 时间:2024/05/19 02:27
不难的题。首先任意环上的边一定不是必经边,答案为B。我们随便搞一颗原图的dfs树,那么非树边,和每条飞树边覆盖的树上的链都是B。在树上打链覆盖的标记即可。
然后是对于每个x到y有路的限制,我们直接在x->lca打向上走的标记,lca->y打向下走的标记,最后判断一下就好了。
#include<cstdio>#include<algorithm>using namespace std;const int maxn=200005, maxe=400005;struct Edge{ int x,y;} Es[maxn], queB[maxn];int n,m,Q,tmplen,tagB[maxn],tagL[maxn],tagR[maxn],ans[maxn],fa_id[maxn];int fir[maxn],nxt[maxe],son[maxe],id[maxe],tot;bool in_t[maxn],vis_e[maxn],vis[maxn],is_rt[maxn];void add(int x,int y,int z){ son[++tot]=y; id[tot]=z; nxt[tot]=fir[x]; fir[x]=tot;}void dfs1(int x){ vis[x]=true; for(int j=fir[x];j;j=nxt[j]) if(!vis_e[id[j]]){ vis_e[id[j]]=true; if(!vis[son[j]]) fa_id[son[j]]=id[j], in_t[id[j]]=true, dfs1(son[j]); else{ ans[id[j]]='B'; queB[++tmplen].x=x; queB[tmplen].y=son[j]; } }}int dep[maxn],anc[maxn][20];void dfs_info(int x,int pre){ anc[x][0]=pre; for(int i=1;i<=18;i++) anc[x][i]=anc[anc[x][i-1]][i-1]; for(int j=fir[x];j;j=nxt[j]) if(in_t[id[j]]&&son[j]!=pre) dep[son[j]]=dep[x]+1, dfs_info(son[j],x);}int LCA(int x,int y){ if(dep[x]<dep[y]) swap(x,y); for(int i=18;i>=0;i--) if(dep[anc[x][i]]>=dep[y]) x=anc[x][i]; if(x==y) return x; for(int i=18;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i], y=anc[y][i]; return anc[x][0];}void dfs(int x,int pre){ for(int j=fir[x];j;j=nxt[j]) if(in_t[id[j]]&&son[j]!=pre){ dfs(son[j],x); tagB[x]+=tagB[son[j]]; tagL[x]+=tagL[son[j]]; tagR[x]+=tagR[son[j]]; } if(tagB[x]) ans[fa_id[x]]='B'; else if(tagR[x]) ans[fa_id[x]]=Es[fa_id[x]].x==x?'R':'L'; else if(tagL[x]) ans[fa_id[x]]=Es[fa_id[x]].y==x?'R':'L'; else ans[fa_id[x]]='B';}int main(){ freopen("A.in","r",stdin); freopen("A.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&Es[i].x,&Es[i].y); add(Es[i].x,Es[i].y,i); add(Es[i].y,Es[i].x,i); } for(int i=1;i<=n;i++) if(!vis[i]) is_rt[i]=true, dfs1(i), dfs_info(i,i); for(int i=1;i<=tmplen;i++) tagB[queB[i].x]++, tagB[queB[i].y]++, tagB[LCA(queB[i].x,queB[i].y)]-=2; scanf("%d",&Q); for(int i=1;i<=Q;i++){ int x,y,_lca; scanf("%d%d",&x,&y); _lca=LCA(x,y); tagR[x]++; tagR[_lca]--; tagL[y]++; tagL[_lca]--; } for(int i=1;i<=n;i++) if(is_rt[i]) dfs(i,i); for(int i=1;i<=m;i++) putchar(ans[i]); return 0;}
阅读全文
0 0
- [dfs树]「CEOI 2017」One-Way Streets
- [乱搞]「CEOI 2017」One-Way Streets
- [双联通分量 并查集] CEOI 2017. One-Way Streets
- [CEOI2017]One-Way Streets
- lightoj 1049 - One Way Roads 【DFS】
- [树形DP]「CEOI 2017 Practice」Museum
- Light OJ 1049 - One Way Roads (暴力 or DFS)
- LightOJ--1049--One Way Roads(dfs)(好题)
- DFS单向复制的疑问/Is it possible to configure one-way replication with DFS Replication?
- Codeforces Round #375 (Div. 2) -- E. One-Way Reform(dfs求欧拉回路)
- One-way Web Hacking
- one way单程杀机
- One-way ANOVA
- Blizzard One-Way Hash
- lightoj1049 - One Way Roads
- React one-way flow
- codeforce723E One-Way Reform
- rank() one way useful
- 深入剖析Clustered Metro Cluster双数据中心存储方案
- AB 850 和1769两种型号PLC作为控制器 通过驱动给到减速机进而完成控制机械臂
- Revit二次开发之双事件:空闲事件与DocumentChanged事件
- 清华与微软:携手同舟二十年,共创AI新辉煌
- 黄学东:语音识别军备竞赛中小数点差距有何意义
- [dfs树]「CEOI 2017」One-Way Streets
- 内核融合:GPU深度学习的“加速神器”
- Barbara Grosz:不做替代品!构建可实现高级人机协作的AI系统
- 现实版“读心术”,读懂你性格的个性化推荐
- Michael I. Jordan:我们并非处于人工智能的大爆炸时代
- 开源 | 微软、Facebook联手打造AI生态系统ONNX
- 专访ICIP 2017技术程序主席曾文军:新技术带来新数据,“旧瓶”装不了“新酒”
- 微软用12年的时间让量子计算走进现实
- 可解释推荐系统:身怀绝技,一招击中用户心理