题意:有三种药丸,三种药丸的重量不同,现在给你一定的重量关系,让你找出种类确定的方案。
思路:对于重量相同的药丸,可以看成是相同的。所以我们是用并查集来维护相同重量的药丸。同时因为只有三种药丸,所以当某条重量传递的长度等于3的时候才能够确定这三种药丸的类型。如果只有两个,则无法判断。所以我们只需要找到所有重量处在中间的药丸,并更新比他重和比他轻的药丸即可。其他剩下来没有更新的药丸重量无法判断,
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define sp system("pause")
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
struct Edge
{
int to, next,from;
}edge[1000000+50];
int fa[1050];
int head[1050],tot;
int in[1050],out[1050];
int col[1050];
void init()
{
memset(head, -1, sizeof head);
for (int i = 0; i < 1050; i++)fa[i] = i;
tot = 0;
memset(in,0, sizeof in);
memset(out, 0, sizeof out);
memset(col, -1, sizeof col);
}
int getfa(int x)
{
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
void merge(int x, int y)
{
int faa = getfa(x), fbb = getfa(y);
if (faa > fbb)swap(faa, fbb);
if (faa != fbb)
{
fa[fbb] = faa;
}
}
void addedge(int h,int u,int v)
{
edge[tot].from = u;
edge[tot].to = v;
edge[tot].next = head[h];
head[h] = tot++;
}
queue<pii>q;
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n, m;
scanf("%d%d",&n,&m);
init();
for (int i = 0; i < m; i++)
{
int x, y;
char cc;
scanf("%d%c%d", &x, &cc, &y);
if (cc == '=')merge(x, y);
else
{
if (cc == '<')
{
//in[x]++;
//out[y]++;
addedge(x, y, x);
addedge(y, y, x);
}
else
{
//in[y]++;
//out[x]++;
addedge(x, x, y);
addedge(y, x, y);
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = head[i]; j != -1; j = edge[j].next)
{
if (edge[j].from == i)
{
out[getfa(i)]++;
in[getfa(edge[i].to)]++;
}
else
{
out[getfa(edge[i].from)]++;
in[getfa(i)]++;
}
}
}
for (int i = 1; i <= n; i++)
{
if (in[getfa(i)] && out[getfa(i)])
{
col[getfa(i)] = 2;
//q.push(pii(i, 2));
}
}
for (int i = 1; i <= n; i++)
{
if (col[getfa(i)] == 2)
{
for (int j = head[i]; j != -1; j = edge[j].next)
{
if (edge[j].from == i)col[getfa(edge[j].to)] = 1;
else col[getfa(edge[j].from)] = 3;
}
}
}
for (int i = 1; i <= n; i++)
{
if (col[getfa(i)] == 3)printf("W");
else if (col[getfa(i)] == 2)printf("R");
else if (col[getfa(i)] == 1)printf("B");
else printf("?");
}
printf("\n");
//sp;
}