原题链接:阴阳
这题我本来还想用简单的分支结构码出来的,就是每个数都附上不同的字符,尝试后失败,主要卡点在于同样一个数可能附上不同的字符(若附以’+’或’-‘)。后来嘛。。。这题因为有数与数的接连关系,所以还只能用并查集,听了老师傅的讲解,后又学了大神网友的代码,跟着大神码了一遍(大神的这个代码以后可以当做模板)代码如下:
#include<bits/stdc++.h>
using namespace std;
int father[100005],gx[100005];//gx[]里面放的就是节点与当前根的的关系
int n;
void init(){//这里初始化 每个节点的根指向自己 各自独立
int i;
for(int i=1;i<=n;i++){
father[i]=i;
gx[i]=0;//默认值为0 表示他们默认与自己相生
}
}
int getfather(int x){//找根祖
if(father[x]==x){
return x;
}
father[x]=getfather(father[x]);
return father[x];
}
int fun(int x,int y){// 两棵还不相关的树建立关联
father[getfather(x)]=getfather(father[y]);
}
void updata(int x){//更新一下根祖和gx
int node=x;
int pos=x;
while(father[node]!=node){
gx[pos]+=gx[father[node]];
node=father[node];
}
father[pos]=node;
}
int main(){
int m,a,b,c,temp;
cin>>n>>m;
init();
while(m--){
cin>>a>>b>>c;
updata(a);//更新一下 好判定
updata(b);
if(father[a]!=father[b]){//要是ab不同根
gx[father[a]]=gx[a]+gx[b]+c;//旧根与新根的关系
fun(a,b);
}
}
int x,y;
cin>>x>>y;
updata(x);
updata(y);
if(father[x]!=father[y]){//并未建立关系
cout<<-1<<endl;
}else{
if(((gx[x]+gx[y])%2)==0){
cout<<0<<endl;
}else{
cout<<1<<endl;
}
}
return 0;
}
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复