题意:有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的更多相关文章

  1. Gym - 101243F Vitamins(思维+并查集)

    题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...

  2. POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)

    题意 在一个有N(1 ≤ N ≤ 1,000)个点环形图上有P(1 ≤ P ≤ 10,000)对点需要连接.连接只能连接环上相邻的点.问至少需要连接几条边. 思路 突破点在于最后的结果一定不是一个环! ...

  3. BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)

    [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...

  4. bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】

    枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...

  5. bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】

    m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 #inc ...

  6. nyoj 711 枚举+并查集

     #include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...

  7. SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何

    <传送门> 128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N poi ...

  8. HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)

    一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...

  9. 【BZOJ1050】【枚举+并查集】旅行comf

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

随机推荐

  1. Spring的BeanFactory体系结构(一)

    本文使用的代码是: Spring 3.0 接 触Spring也有很长一段时间了.但是,每次都是直接使用Spring直接提供的API,时间久了,自然也会想探索Spring里面的奥秘.今天上 午,整理出了 ...

  2. css文本垂直水平居中

    一.单行文本居中 .content{ height:100px; line-height:100px; text-align:center; border:1px solid red; } 效果图 二 ...

  3. 我用.htaccess做了些什么?

    1.防图片盗链,减轻流量压力: 2.index.php 301转向到域名,有利于PR权重集中: 3.其它还不会,慢慢来…… 我是如何做的? <IfModule mod_rewrite.c> ...

  4. linux运维记

    nmap 127.0.0.1 命令查看当前服务器对外有多少端口,用于检查漏洞 vim ctrl+z ,jobs,fg 切换控制应用程序 vim 执行命令 #!sh aa.sh执行命令 运维系统监控开源 ...

  5. scrapy框架搭建与第一个实例

    scrapy是python的一个网络爬虫框架,关于它的介绍有很多资料,这里不做过多介绍(好吧我承认我还不是很懂...).我现在还在摸索阶段,因为用scrapy爬取的第一个网站非常简单,不涉及登陆.验证 ...

  6. form 表单获取所有数据 封装方法

    function getFormJson(frm) { var o = {}; var a = $(frm).serializeArray(); $.each(a, function () { if ...

  7. MYSQL表中设置字段类型为TIMESTAMP时的注意事项

    在MYSQL中,TIMESTAMP类型是用来表示日期的,但是和DATETIME不同,不同点就不再这里说明了. 当我们在使用TIMESTAMP类型设置表中的字段时,我们应该要注意一点,首先我们在表中新增 ...

  8. rabbitmq源码安装及配置文件管理

    rabbitmq 源码安装 官网地址:rabbitmq http://www.rabbitmq.com/releases/rabbitmq-server/ 官网地址:erlang http://erl ...

  9. linux系统使用过程遇到的bug

    使用windows与ubuntu双系统,重装windows系统后需要修复ubuntu grub reference ubuntu系统中挂载的windows硬盘点不开 需要重新挂载 reference ...

  10. ibatis中的符号#跟$区别

    昨天一个项目中在写ibatis中的sql语句时,order by #field#, 运行时总是报错,后来上网查了查,才知道这里不该用#,而应该用$,随即查了下#与$的区别.  总结如下:  1.#是把 ...