【枚举】【并查集】Gym - 101243F - Vitamins
题意:有n片药,有三种颜色,白色比红色重,红色比蓝色重,给你一些它们之间的重量关系,比如1>3,2=4之类,问你它们的颜色,如果没法判断的输出?。
先并查集把等于号全缩起来,然后按照大于号建图,就是一张DAG,枚举所有的点,发现它如果是一个长度为3的链的中间结点,那么它、它指向的、指向它的颜色都可以判断了。
其他的都无法判断。
#include<cstdio>
#include<cstring>
using namespace std;
int v[2][499505],nex[2][499505],first[2][1005],e[2];
void AddEdge(int U,int V,bool Type){
v[Type][++e[Type]]=V;
nex[Type][e[Type]]=first[Type][U];
first[Type][U]=e[Type];
}
int fa[1005],xs[499505],ys[499505];
char cs[499505];
int n,m;
char s[105];
int find(int x){
return x==fa[x] ? x : fa[x]=find(fa[x]);
}
int trans(int l,int r){
int res=0;
for(int i=l;i<=r;++i){
res=res*10+s[i]-'0';
}
return res;
}
char anss[1005];
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
fa[i]=i;
}
for(int i=1;i<=m;++i){
scanf("%s",s);
int len=strlen(s);
for(int j=0;j<len;++j){
if(!(s[j]>='0' && s[j]<='9')){
xs[i]=trans(0,j-1);
ys[i]=trans(j+1,len-1);
cs[i]=s[j];
if(s[j]=='='){
int f1=find(xs[i]),f2=find(ys[i]);
if(f1!=f2){
fa[f1]=f2;
}
}
break;
}
}
}
for(int i=1;i<=m;++i){
if(cs[i]=='>'){
AddEdge(find(xs[i]),find(ys[i]),0);
AddEdge(find(ys[i]),find(xs[i]),1);
}
else if(cs[i]=='<'){
AddEdge(find(ys[i]),find(xs[i]),0);
AddEdge(find(xs[i]),find(ys[i]),1);
}
}
for(int i=1;i<=n;++i){
int f=find(i);
if(f!=i){
continue;
}
if(first[0][f] && first[1][f]){
anss[i]='R';
for(int j=first[0][f];j;j=nex[0][j]){
anss[v[0][j]]='B';
}
for(int j=first[1][f];j;j=nex[1][j]){
anss[v[1][j]]='W';
}
}
}
for(int i=1;i<=n;++i){
int f=find(i);
if(f!=i){
anss[i]=anss[f];
}
}
for(int i=1;i<=n;++i){
if(anss[i]!=0){
putchar(anss[i]);
}
else{
putchar('?');
}
}
puts("");
return 0;
}
【枚举】【并查集】Gym - 101243F - Vitamins的更多相关文章
- Gym - 101243F Vitamins(思维+并查集)
题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...
- POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
题意 在一个有N(1 ≤ N ≤ 1,000)个点环形图上有P(1 ≤ P ≤ 10,000)对点需要连接.连接只能连接环上相邻的点.问至少需要连接几条边. 思路 突破点在于最后的结果一定不是一个环! ...
- BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
- bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】
枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...
- bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】
m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 #inc ...
- nyoj 711 枚举+并查集
#include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...
- SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何
<传送门> 128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N poi ...
- HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)
一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...
- 【BZOJ1050】【枚举+并查集】旅行comf
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
随机推荐
- js 的function为什么可以添加属性
(1) function person(){ this.name = 'Tom'; } (2) function person(){} person.name = 'Tom'; (3) functio ...
- 无缝衔接demo
如题. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" con ...
- HashMap 、LinkedHashMap、HashTable、TreeMap 和 Properties 的区别
HashMap 1.线程不安全: 2.允许null value 和 null key: 3.访问效率比较高: 4.Java1.2引进的Map接口的一个实现: 5.轻量级: 6.根据键的HashCode ...
- 002 Lock和synchronized的区别和使用
转自 https://www.cnblogs.com/baizhanshi/p/6419268.html 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟 ...
- Mac iphone 使用 如何修改apple 用户名 XXX的mac Mac 与iphone如何连接 传递文件 为iphone增加铃声 iphone铃声的制作---城
1.更改mac apple id Apple ID 即用户名称,您可以将其用于与 Apple 有关的所有操作.为某个 Apple 服务(如 iCloud 或 App Store)创建帐户时即创建了 A ...
- 流程控制--while
/* while 是在有条件控制的情况下 进行的循环 */ [root@localhost test1]# vim .py //ADD #!/usr/bin/python n = while True ...
- 阿里CDN核心技术解密
1. 阿里CDN组件分层 其中应用层主要用到的技术有负载均衡和缓存, 负载均衡包括全局负载均衡和本地负载均衡; 缓存通过HTTP缓存服务器Swift做HTTP缓存. 全局负载均衡以DNS服务器Phar ...
- js-callee,call,apply概念
JS - caller,callee,call,apply 概念[转载] 在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正 ...
- java中的Map集合
Map接口 Map为一个接口.实现Map接口的类都有一个特点:有键值对,将键映射到值的对象. Map不能包含重复的键,每个键可以映射到最多一个值. Map常见的接口方法有: V put(K key, ...
- Edit Distance——经典的动态规划问题
题目描述Edit DistanceGiven two words word1 and word2, find the minimum number of steps required to conve ...