题解

这种题的解法其实我觉得很多都是随便弄一个生成树,然后再生成树上面加边,然后乱搞。。
这题也是一样,你先随便弄一个生成树
然后你你每次加一条边,如果出现了环,那么这上面所有的边就都是B了
然后我们考虑L和R怎么判,很明显,在判完B之后,剩下的都是无环的
然后又因为数据合法
所以不会出现说方向不同的两条目标路
这启发我们可以使用一个树上差分,然后就知道一条边的指向了
具体看代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100005;
int n,m,p;
struct qq
{int x,y,last,id;
}e[N*2];
int num,last[N];
void init (int x,int y,int z)
{e[++num].x=x;e[num].y=y;e[num].id=z;e[num].last=last[x];last[x]=num;
}
int f2[N],f1[N];//树上差分,这个是要往哪一个方向
bool vis[N],vis1[N<<1];
char ans[N];
void dfs (int x)
{vis[x]=true;for (int u=last[x];u!=-1;u=e[u].last){int y=e[u].y;if (vis[y]==false)//这个点访问过了{vis1[e[u].id]=true;dfs(y);}else{if (vis1[e[u].id]==false)//如果这条边没走过,那么就是有环了 {ans[e[u].id]='B';vis1[e[u].id]=true;f1[x]++;f1[y]--;}}}
}
void dfs1 (int x)
{vis[x]=true;for (int u=last[x];u!=-1;u=e[u].last){int y=e[u].y;if (vis[y]==true) continue;dfs1(y);if (f1[y]>0)//还是一个环ans[e[u].id]='B';else if ((f2[y]>0&&(u&1))||(f2[y]<0&&(!(u&1))))ans[e[u].id]='L';else if ((f2[y]<0&&(u&1))||(f2[y]>0&&(!(u&1))))ans[e[u].id]='R';f1[x]+=f1[y];f2[x]+=f2[y];}
}
int main()
{num=0;memset(last,-1,sizeof(last));scanf("%d%d",&n,&m);for (int u=1;u<=m;u++){int x,y;scanf("%d%d",&x,&y);init(x,y,u);init(y,x,u);}scanf("%d",&p);for (int u=1;u<=p;u++){int x,y;scanf("%d%d",&x,&y);f2[x]++;f2[y]--;}memset(vis,false,sizeof(vis));memset(vis1,false,sizeof(vis1));for (int u=1;u<=n;u++)if (!vis[u])dfs(u);memset(vis,false,sizeof(vis));for (int u=1;u<=n;u++)if (!vis[u])dfs1(u);for (int u=1;u<=m;u++){if (ans[u]==0) printf("B");else printf("%c",ans[u]);}return 0;
}

[CEOI2017]One-Way Streets相关推荐

  1. One-Way Streets (oneway)

    One-Way Streets (oneway) One-Way Streets (oneway) 题目描述 Once upon a time there was a country with nn  ...

  2. POJ 3889 Fractal Streets(逼近模拟)

    $ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...

  3. Fractal Streets

    FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...

  4. CF1070J Streets and Avenues in Berhattan

    题目:Streets and Avenues in Berhattan 思路:指把一种颜色分开一定是最优的. 代码: #include<bits/stdc++.h> using names ...

  5. Fractal Streets(经典分形递归+坐标旋转)

    原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...

  6. H - Streets of Working Lanterns Gym - 101149H -括号匹配-栈模拟

    H - Streets of Working Lanterns Gym - 101149H 题意:括号匹配,有很多"?",这些"?"可以凑成任意一种,判断最后能 ...

  7. uva 11595 - Crossing Streets EXTREME(切割多边形)

    题目链接:uva 11595 - Crossing Streets EXTREME 对初始平面进行切割,得到所有平面,然后处理出所有边,有公共边的两个平面之间可以到达,对于城市的权值可以加到点上,进出 ...

  8. 【LOJ】【树形DP】2485 「CEOI2017」Chase

    LOJ 2485 「CEOI2017」Chase 题目大意 ◇题目传送门◆ 似乎压缩起来有点困难,所以就不压缩了吧 QwQ- 分析 考虑扔一个磁铁能够产生的让逃亡者和追逐者之间的差异. 这个差异就是这 ...

  9. Locking up men does nothing more than keep them off the streets.

    Locking up men does nothing more than keep them off the streets. 要翻译这句话,首先要理解下面两个短语的意思: nothing more ...

最新文章

  1. PHP的学习--Traits新特性
  2. OAuth2.0授权码模式学习
  3. ubuntu 16.04 配置Python2.7 和 Python3.5 同时调用OpenCV
  4. 云小课 | 华为云KYON:网段零修改上云,简单又好用
  5. Embree:照片级光线追踪内核
  6. php获取模型错误,php – 解析错误,期望activecollab模型类中出现“T_PAAMAYIM_NEKUDOTAYIM”错误...
  7. CTF---Web入门第八题 Guess Next Session
  8. java四方支付系统
  9. 阵列信号处理知识点合集
  10. oem13c安装参考
  11. 【vishwaCTF】web题解wp
  12. python实现抓包_使用Python实现windows下的抓包与解析
  13. junit忽略测试方法
  14. 计算机基础学习记录2-1
  15. canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
  16. css中@media写法在ie 、firefox、Opera、Chrome、Safari 浏览器中的支持
  17. 手机PDF阅读器哪个好?
  18. 人工智能里的数学修炼 | 矩阵的花样分解:特征值分解(EVD)、相似对角化、QR分解、Schur分解、奇异值分解(SVD)的概念纠缠与详解
  19. Magics 23.0测量工具使用方法
  20. 28、最小的k个数(TopK)

热门文章

  1. 华为云认证有什么用?怎么考?
  2. 微信页面触发返回按钮回到聊天界面
  3. 解决sublime汉化后部分中文显示为繁体字
  4. 流程控制语句------顺序结构(一)
  5. mac搜不到Android模拟器,听不到声音Android模拟器Mac
  6. 2019年人工智能产业发展调研报告
  7. 小米2020校招软件开发工程师笔试题二
  8. Oracle - 锁
  9. 一个用js写的沙漏程序 hourglass
  10. 人工智能面试总结:160个机器学习面试题,赶紧先考考自己!