记录编号 |
593770 |
评测结果 |
R |
题目名称 |
[POJ 1417]真正的说谎者 |
最终得分 |
0 |
用户昵称 |
郑霁桓 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2024-09-12 22:00:30 |
内存使用 |
3.39 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,q,x,y,fa[605],s[605],aa,a[605],ss[605][2];
long long dp[605][605],ps[605][605],pp,vp[605][605];
string p;
long long f(long long x){
if(fa[x]!=x){
long long p;
p=f(fa[x]);
if(fa[fa[x]]!=fa[x]){
s[x]^=s[fa[x]];
}
fa[x]=p;
}
return fa[x];
}
long long ff(long long x){
if(fa[x]!=x){
fa[x]=f(fa[x]);
}
return fa[x];
}
int main(){
freopen("td.in","r",stdin);
freopen("td.out","w",stdout);
while(1){
cin>>n>>m>>q;
for(int i=1;i<=m+q;i++){
fa[i]=i;
s[i]=a[i]=0;
}
if(!n&&!m&&!q){
return 0;
}
for(int i=1;i<=n;i++){
cin>>x>>y>>p;
if(f(x)==f(y)){
continue;
}
if(p[0]=='n'){
s[f(x)]=1;
}else{
s[f(x)]=0;
}
fa[f(x)]=y;
}
aa=0;
for(int i=1;i<=m+q;i++){
f(i);
if(fa[i]!=i){
s[i]^=s[fa[i]];
}
if(f(i)==i){
a[f(i)]=++aa;
}
}
for(int i=1;i<=m+q;i++){
for(int j=0;j<=m+q;j++){
ss[i][j]=0;
}
}
memset(dp,0,sizeof(dp));
memset(ps,0,sizeof(ps));
for(int i=1;i<=m+q;i++){
ss[a[ff(i)]][s[i]]++;
for(int j=0;j<=m+q;j++){
dp[i][j]=ps[i][j]=vp[i][j]=0;
}
}
dp[0][0]=1;
for(int i=1;i<=aa;i++){
for(int j=0;j<=m+q;j++){
if(j>=ss[i][0]&&dp[i-1][j-ss[i][0]]){
dp[i][j]+=dp[i-1][j-ss[i][0]];
ps[i][j]=ss[i][0];
}
if(j>=ss[i][1]&&dp[i-1][j-ss[i][1]]){
dp[i][j]+=dp[i-1][j-ss[i][1]];
ps[i][j]=ss[i][1];
}
}
}
if(dp[aa][m]!=1){
cout<<"no\n";
continue;
}
pp=m;
for(int i=aa;i>=1;i--){
if(ps[i][pp]==ss[i][0]){
vp[i][0]=1;
}else{
vp[i][1]=1;
}
pp-=ps[i][pp];
}
for(int i=1;i<=m+q;i++){
if(vp[a[f(i)]][s[i]]){
cout<<i<<"\n";
}
}
cout<<"end\n";
}
return 0;
}