题意
有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’
题解
如果1<2<3,只要找到2就能确定1和3的颜色
如果2=4,只要确定一个就能确定另一个
处理的时候先把=用并查集处理一下
在处理<和>号
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 const int maxm=maxn*maxn/2; 6 int f[maxn]; 7 int u[maxm],v[maxm],op[maxm]; 8 vector<int>big[maxn],small[maxn]; 9 char s[50]; 10 int find(int x) 11 { 12 return f[x]==x?x:f[x]=find(f[x]); 13 } 14 int main() 15 { 16 freopen("input.txt","r",stdin); 17 freopen("output.txt","w",stdout); 18 int n,m; 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++)f[i]=i; 21 for(int i=1;i<=m;i++) 22 { 23 scanf("%s",s); 24 int l=strlen(s),sum=0; 25 for(int j=0;j<=l;j++) 26 { 27 if(j==l) 28 { 29 v[i]=sum; 30 continue; 31 } 32 if(s[j]>='0'&&s[j]<='9') 33 sum=sum*10+s[j]-'0'; 34 else 35 { 36 if(s[j]=='>')op[i]=1; 37 if(s[j]=='<')op[i]=2; 38 if(s[j]=='=')op[i]=3; 39 u[i]=sum,sum=0; 40 } 41 } 42 if(op[i]==3)f[find(u[i])]=find(v[i]); 43 } 44 for(int i=1;i<=m;i++) 45 if(op[i]==1) 46 { 47 int fu=find(u[i]),fv=find(v[i]); 48 small[fu].push_back(fv); 49 big[fv].push_back(fu); 50 } 51 else if(op[i]==2) 52 { 53 int fu=find(u[i]),fv=find(v[i]); 54 small[fv].push_back(fu); 55 big[fu].push_back(fv); 56 } 57 char ans[maxn]; 58 memset(ans,'?',sizeof ans); 59 for(int i=1;i<=n;i++) 60 { 61 if(small[i].size()>0&&big[i].size()>0) 62 { 63 ans[i]='R'; 64 for(int j=0;j<small[i].size();j++) 65 ans[small[i][j]]='B'; 66 for(int j=0;j<big[i].size();j++) 67 ans[big[i][j]]='W'; 68 } 69 } 70 for(int i=1;i<=n;i++) 71 if(f[i]==i) 72 { 73 for(int j=1;j<=n;j++) 74 { 75 if(ans[j]=='?'&&find(j)==f[i]) 76 ans[j]=ans[i]; 77 } 78 } 79 for(int i=1;i<=n;i++) 80 printf("%c",ans[i]); 81 printf("\n"); 82 return 0; 83 }