[CEOI2017]One-Way Streets
题解
这种题的解法其实我觉得很多都是随便弄一个生成树,然后再生成树上面加边,然后乱搞。。
这题也是一样,你先随便弄一个生成树
然后你你每次加一条边,如果出现了环,那么这上面所有的边就都是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相关推荐
- One-Way Streets (oneway)
One-Way Streets (oneway) One-Way Streets (oneway) 题目描述 Once upon a time there was a country with nn ...
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- Fractal Streets
FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...
- CF1070J Streets and Avenues in Berhattan
题目:Streets and Avenues in Berhattan 思路:指把一种颜色分开一定是最优的. 代码: #include<bits/stdc++.h> using names ...
- Fractal Streets(经典分形递归+坐标旋转)
原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...
- H - Streets of Working Lanterns Gym - 101149H -括号匹配-栈模拟
H - Streets of Working Lanterns Gym - 101149H 题意:括号匹配,有很多"?",这些"?"可以凑成任意一种,判断最后能 ...
- uva 11595 - Crossing Streets EXTREME(切割多边形)
题目链接:uva 11595 - Crossing Streets EXTREME 对初始平面进行切割,得到所有平面,然后处理出所有边,有公共边的两个平面之间可以到达,对于城市的权值可以加到点上,进出 ...
- 【LOJ】【树形DP】2485 「CEOI2017」Chase
LOJ 2485 「CEOI2017」Chase 题目大意 ◇题目传送门◆ 似乎压缩起来有点困难,所以就不压缩了吧 QwQ- 分析 考虑扔一个磁铁能够产生的让逃亡者和追逐者之间的差异. 这个差异就是这 ...
- 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 ...
最新文章
- PHP的学习--Traits新特性
- OAuth2.0授权码模式学习
- ubuntu 16.04 配置Python2.7 和 Python3.5 同时调用OpenCV
- 云小课 | 华为云KYON:网段零修改上云,简单又好用
- Embree:照片级光线追踪内核
- php获取模型错误,php – 解析错误,期望activecollab模型类中出现“T_PAAMAYIM_NEKUDOTAYIM”错误...
- CTF---Web入门第八题 Guess Next Session
- java四方支付系统
- 阵列信号处理知识点合集
- oem13c安装参考
- 【vishwaCTF】web题解wp
- python实现抓包_使用Python实现windows下的抓包与解析
- junit忽略测试方法
- 计算机基础学习记录2-1
- canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
- css中@media写法在ie 、firefox、Opera、Chrome、Safari 浏览器中的支持
- 手机PDF阅读器哪个好?
- 人工智能里的数学修炼 | 矩阵的花样分解:特征值分解(EVD)、相似对角化、QR分解、Schur分解、奇异值分解(SVD)的概念纠缠与详解
- Magics 23.0测量工具使用方法
- 28、最小的k个数(TopK)