蒟蒻求助!wa了七个点,留下了不学无术的眼泪QAQ

P2024 [NOI2001] 食物链

代码插错了。。。。。。 ```c #include<iostream> using namespace std; int n,m; int fa[50001]; int vis2[50001]; int ans; int get(int x){ if(fa[x]==x){ return x; } return fa[x]=get(fa[x]); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int a,b,c; cin>>a>>b>>c; if(a==1){ if(b>n||c>n){ ans++; continue; } int bb=get(b); int cc=get(c); if(vis2[cc]!=bb&&vis2[bb]!=cc){ //如果c不吃b,b也不吃c,就算同类。 fa[cc]=bb; }else{ ans++; continue; } }else{ if(b>n||c>n||b==c){ ans++; continue; } int cc=get(c); int bb=get(b); if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b; vis2[b]=cc;//b吃c为真 }else{ ans++; continue; } } } cout<<ans; return 0; } ```
by Called47 @ 2018-10-29 20:03:57


震惊!蒟蒻怒切noi原题!
by flowerletter @ 2018-10-29 20:05:30


@[Called47](/space/show?uid=94259) if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b; vis2[b]=cc;//b吃c为真 } 这句话要把b原先的天敌和cc合并在一个并查集里面,并且c也是b天敌的天敌(题目里的ABC关系),也要合并在一起
by 基础不牢 @ 2018-10-29 20:23:26


@[Andy_Park](/space/show?uid=87637) 谢谢大佬,我去试试。
by Called47 @ 2018-10-29 20:52:38


@[白衣渡川](/space/show?uid=55650) 大佬您AKIOI
by Called47 @ 2018-10-29 21:41:11


@[Andy_Park](/space/show?uid=87637) 有个地方我还是不太明白 b原先的天敌我怎么找?
by Called47 @ 2018-10-29 21:43:04


@[Andy_Park](/space/show?uid=87637) 大佬我自己改了改,又拿了10分233 还是不太清楚哪里错了,是不是还是那三种关系错了? 谢谢大佬QAQ ```c #include<iostream> using namespace std; int n,m; int fa[50001]; int vis2[50001]; int ans; int get(int x){ if(fa[x]==x){ return x; } return fa[x]=get(fa[x]); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int a,b,c; cin>>a>>b>>c; if(a==1){ if(b>n||c>n){ ans++; continue; } int bb=get(b); int cc=get(c); if(vis2[cc]!=bb&&vis2[bb]!=cc){ //如果c不吃b,b也不吃c,就算同类。 fa[cc]=fa[bb]; vis2[bb]=vis2[cc]; int aa=get(vis2[vis2[bb]]); vis2[aa]=fa[cc]; }else{ ans++; continue; } }else{ if(b>n||c>n||b==c){ ans++; continue; } int cc=get(c); int bb=get(b); if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b; vis2[bb]=fa[cc]; int aa=get(vis2[cc]); vis2[cc]=fa[aa]; vis2[aa]=fa[bb]; }else{ ans++; continue; } } } cout<<ans; return 0; } ```
by Called47 @ 2018-10-30 18:14:25


你可以看看第一个题解
by 基础不牢 @ 2018-10-30 18:51:21


哪位大佬救救我的代码//伤心++; ```cpp #include <bits/stdc++.h> #define f(h,y,l) for(int h=y;h<=l;h++) #define zdsj 100005 using namespace std; int fa[3*zdsj],n,ans=0; int re() { char c=getchar();int res=0; while('0'>c&&c<'9') c=getchar(); while('0'<=c&&c<='9') res=(res<<3)+(res<<1)+c-'0',c=getchar(); return res; } void setmake(int a) { f(i,1,3*a) fa[i]=i; } int check(int a) { return fa[a]==a ? a : fa[a]=check(fa[a]); } int main() { int k; scanf("%d%d",&n,&k); f(i,1,k) { int xx=re(),loves=re(),hyl=re(); setmake(n); if(loves>n||hyl>n) { ans++; continue; } if(xx==1) { if(check(loves)==check(hyl+n)||check(loves+n)==check(hyl)||check(loves+2*n)==check(hyl+n)) { ans++; } else { fa[check(loves)]=check(hyl); fa[check(loves+n)]=check(hyl+n); fa[check(loves+2*n)]=check(hyl+2*n); } } else { if(check(loves)==check(hyl)||check(loves+n)==check(hyl+n)||check(loves+2*n)==check(hyl+2*n)) { ans++; } else { fa[check(loves+n)]=check(hyl); fa[check(loves+2*n)]=check(hyl+n); fa[check(loves)]=check(hyl+2*n); } } } printf("%d",ans); return 0; } ```
by XieXuan @ 2019-02-04 13:30:14


|