P2024 [NOI2001] 食物链
Solution:
使用拓展域并查集,
那么对于操作一,我们首先判断
-
若吃了,那么这句话为假
-
若没吃,则将
(x,y) (x+n,y+n) (x+2n,y+2n)
三条边连上
对于操作二,同理若果
否则就连 (x,y+2n) (x+n,y) (x+2n,y+n)
三条边。
注意判断
code:
#include<bits/stdc++.h> #define int long long #define Flow {ans++;continue;} //假的时候 using namespace std; const int N=5e4+10; int f[N*3],n; int findfa(int x){return f[x]=(f[x]==x)?x:findfa(f[x]);} int ans; signed main(){ std::ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int T; cin>>n>>T; for(int i=1;i<=3*n;i++)f[i]=i; while(T--){ int opt,x,y; cin>>opt>>x>>y; if(x>n||y>n)Flow;//注意这里判断是否越界 if(opt==1){ if(findfa(x)==findfa(y+n)||findfa(x+n)==findfa(y))Flow;//判断 f[findfa(x)]=findfa(y);// 连边 f[findfa(x+n)]=findfa(y+n); f[findfa(x+2*n)]=findfa(y+2*n); } else{ if(findfa(x)==findfa(y)||findfa(x)==findfa(y+n))Flow; f[findfa(x)]=findfa(y+2*n); f[findfa(x+n)]=findfa(y); f[findfa(x+2*n)]=findfa(y+n); } } cout<<ans<<endl; return 0; }
本文作者:Little_corn
本文链接:https://www.cnblogs.com/little-corn/p/18157455
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步