蓝桥侦探
https://www.lanqiao.cn/problems/1136/learning/
意思就是给m个数据,每组里面的x,y对立,求下一个不符合条件的编号
种类并查集:
描述就是
知道了这个之后,这个题就是很好的一个板子入门题
#include<iostream> using namespace std; const int M=1e5+10,N=2*M; int p[N]; int n,m; int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } void merge(int x,int y) { int xx=find(x); int yy=find(y); if(xx!=yy) p[xx]=yy; } int main(){ cin>>n>>m; for(int i=1;i<=2*n;i++) p[i]=i; int res; while(m--) { int x,y; cin>>x>>y; if(find(x)==find(y)||find(x+n)==find(y+n)) { res=x; break; } merge(x+n,y);//x的对立为x+n,x,y两个是敌人,那x的对立是x+n与y是朋友,合并 merge(x,y+n); } cout<<res<<endl; return 0; }
*****************************
二刷:
刚刚又细品了一下
其实总共就那么多个人,假设有5个人,如果有两种,那开二倍也就是10个,i+n就是i的一个敌人而已,那就放另外一个集合里面,但其实更像是i+n是i的一个虚拟敌人而已,凑出敌人的敌人是朋友
好把真正的那5个人归类,又看了一眼上面的代码,find(x+n)==find(y+n)那句话其实压根不需要,那只是虚拟敌人仅此而已,集合里是会有这些虚拟的人,但答案里并不包含啊
所以尝试的把那句话删掉,也能ac
P1525 [NOIP2010 提高组] 关押罪犯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个懂了之后可以拿洛谷的这个题再写写
就是从大到小排序之后,如果第一次在同一个集合里面,那必定打架,那也是第一次的,就是那个领导想看到的那个数据
再大点,就不要把那些人放到相同的集合里面,相当于是敌人
#include<iostream> #include<algorithm> using namespace std; const int N=1e5+10; int p[N]; struct data{ int a,b,w; }s[N]; bool cmp(data x,data y) { return x.w>y.w; } int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } void merge(int x,int y) { int xx=find(x); int yy=find(y); if(xx!=yy) p[xx]=yy; } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=2*n;i++) p[i]=i; for(int i=1;i<=m;i++) cin>>s[i].a>>s[i].b>>s[i].w; sort(s+1,s+m+1,cmp); int res; for(int i=1;i<=m;i++) { int x=find(s[i].a); int y=find(s[i].b); if(x==y) { res=s[i].w; cout<<res<<endl; return 0; } merge(s[i].a+n,s[i].b); merge(s[i].a,s[i].b+n); } cout<<0<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具