这题我本来还想用简单的分支结构码出来的,就是每个数都附上不同的字符,尝试后失败,主要卡点在于同样一个数可能附上不同的字符(若附以’+’或’-‘)。后来嘛。。。这题因为有数与数的接连关系,所以还只能用并查集,听了老师傅的讲解,后又学了大神网友的代码,跟着大神码了一遍(大神的这个代码以后可以当做模板)代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int father[100005],gx[100005];//gx[]里面放的就是节点与当前根的的关系
  4. int n;
  5. void init(){//这里初始化 每个节点的根指向自己 各自独立
  6. int i;
  7. for(int i=1;i<=n;i++){
  8. father[i]=i;
  9. gx[i]=0;//默认值为0 表示他们默认与自己相生
  10. }
  11. }
  12. int getfather(int x){//找根祖
  13. if(father[x]==x){
  14. return x;
  15. }
  16. father[x]=getfather(father[x]);
  17. return father[x];
  18. }
  19. int fun(int x,int y){// 两棵还不相关的树建立关联
  20. father[getfather(x)]=getfather(father[y]);
  21. }
  22. void updata(int x){//更新一下根祖和gx
  23. int node=x;
  24. int pos=x;
  25. while(father[node]!=node){
  26. gx[pos]+=gx[father[node]];
  27. node=father[node];
  28. }
  29. father[pos]=node;
  30. }
  31. int main(){
  32. int m,a,b,c,temp;
  33. cin>>n>>m;
  34. init();
  35. while(m--){
  36. cin>>a>>b>>c;
  37. updata(a);//更新一下 好判定
  38. updata(b);
  39. if(father[a]!=father[b]){//要是ab不同根
  40. gx[father[a]]=gx[a]+gx[b]+c;//旧根与新根的关系
  41. fun(a,b);
  42. }
  43. }
  44. int x,y;
  45. cin>>x>>y;
  46. updata(x);
  47. updata(y);
  48. if(father[x]!=father[y]){//并未建立关系
  49. cout<<-1<<endl;
  50. }else{
  51. if(((gx[x]+gx[y])%2)==0){
  52. cout<<0<<endl;
  53. }else{
  54. cout<<1<<endl;
  55. }
  56. }
  57. return 0;
  58. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论