博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noi2002银河英雄传说(并查集)
阅读量:6346 次
发布时间:2019-06-22

本文共 1229 字,大约阅读时间需要 4 分钟。

首先表示对C++读入读出问题复杂程度的敬畏,看了好多没讲明白的,本题用cin竟然过不了评测,搞scanf的读入搞了好久....

本题确实是一道经典的并查集题型,不多讲,拿来练练手用的(其中经历很惨)

用pre[i]表示i到其父节点f[i]之间排几个(父节点算1个)

f[i]表示i的父节点

num[i]表示i的队伍中一共有多少人

大致即 利用父节点与该点距离进行迭代的过程,即pre[x]=pre[x]+pre[f[x]]; 然后每次调整队伍时只要将父节点的位置搞清楚了,其他点都可以根据与父节点关系计算出来

/*看来对于c++这门语言见解不够,或者说c++确实不好用*/
#include
#include
#include
int f[30000],pre[30000],num[30000];using namespace std;int find(int x){ if (f[x]==x) return(x); find(f[x]); pre[x]+=pre[f[x]]; f[x]=f[f[x]]; return(f[x]);}int main(){ int n,i,j,k,a,b,fa,fb; char c; cin>>n; for(k=1;k<=30000;k++){ f[k]=k; num[k]=1; } for(k=1;k<=n;k++){ while (getchar()!='\n');//读入问题至今觉得c++的cin和scanf都相当不好用,可能有的作用不知道,但是没找到真正讲得明白其原理的文章; 只能表示pascal的read,readln的强大 scanf("%c",&c); scanf("%d%d",&a,&b); fa=find(a);fb=find(b); if(c=='M'){ f[fa]=fb; pre[fa]=num[fb]; num[fb]+=num[fa]; } if(c=='C'){ if(fa==fb){ printf("%d\n",((int)abs(pre[a]-pre[b]))-1);//很奇怪的地方,若abs不用int竟然abs返回值变成0,不知为什么? }else printf("-1\n"); } } return 0;}

转载于:https://www.cnblogs.com/Mathics/p/3681190.html

你可能感兴趣的文章
GNS3与抓包工具Wireshark的关联
查看>>
groovy-语句
查看>>
VIM寄存器使用
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>
Silverlight 5 beta新特性探索系列:10.浏览器模式下内嵌HTML+浏览器模式下创建txt文本文件...
查看>>
YourSQLDba 配置——修改备份路径
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
网易音乐版轮播-react组件版本
查看>>
ES6 - 函数与剩余运算符
查看>>
你对position了解有多深?看完这2道有意思的题你就有底了...
查看>>
WebSocket跨域问题解决
查看>>
ECMAScript6基本介绍
查看>>
世界经济论坛发布关于区块链网络安全的报告
查看>>
巨杉数据库加入CNCF云原生应用计算基金会,共建开源技术生态
查看>>
Ubuntu 16.04安装Nginx
查看>>
从 JS 编译原理到作用域(链)及闭包
查看>>
flutter 教程(一)flutter介绍
查看>>