社区讨论

c++递归式的一个bug?

P1525[NOIP 2010 提高组] 关押罪犯参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi6hj5nd
此快照首次捕获于
2025/11/20 04:58
4 个月前
此快照最后确认于
2025/11/20 04:58
4 个月前
查看原帖
第一个是我过的代码
CPP
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int zf[20001];bool tr,en[20001],vis[20001];//enemy==1 friend==0
struct u{
    int a,b,c;
} f[100000];
bool cmp (u a,u b) {
    return a.c>b.c;
}
int find(int x) {
    if(zf[x]==x)return x;
    int tp = find(zf[x]);
    en[x]^=tr;
    tr=en[x];
    return zf[x]=tp;
}
int find2(int x) {
    tr=0;
    return find(x);
}
int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) zf[i]=i;
    for(int i=0;i<m;i++) {
        scanf("%d%d%d",&f[i].a,&f[i].b,&f[i].c);
    }
    sort(f+0,f+m,cmp);//
    for(int i=0;i<m;i++) {
        int x=find2(f[i].a),y=find2(f[i].b),enemy=en[f[i].a]^en[f[i].b];
        if(x!=y) {
            zf[x]=y;
            if(!enemy)en[x]=1;
        }
        else {
            if(vis[f[i].a] && vis[f[i].b] && !enemy) {
                printf("%d\n",f[i].c);
                return 0;
            }
        }
        vis[x]=1;vis[y]=1;
/*/
CPP
    for(int ii=1;ii<=n;ii++) {
        cout<<ii<<" : "<<en[ii]<<"with"<<zf[ii]<<endl;
    }
    cout<<endl;
/*/
CPP
    }
    printf("0\n");
    return 0;
}
其中find函数中用到了 en[x]^=tr;
而只要将该句写成
CPP
   if(tr) en[x]!=en[x];
编译器就毫不留情的把该句跳过了,求大神告诉我这是怎么回事。。。

回复

7 条回复,欢迎继续交流。

正在加载回复...