实在是水,一开始以为最短路算法,想了想没想明白。后来比赛结束看到有人用并查集。。我真是水啊。。。
题意:n点m边,有环输出YES,无环输出最长距离。
两种情况:
1 找uv的根节点,一样的话代表有环
2 uv根节点不一样的话 x为u的根节点,y为v的根节点,lenth[x]+=lenth[y]+w;
#include<stdio.h>
#include<string.h>
int pre[111111],lenth[111111];
int m,n;
int find(int root){
int w=root;
while(pre[root]!=-1){
root=pre[root];
}
while(w!=root){
int it=pre[w];
pre[w]=root;
w=it;
}
return root;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(pre,-1,sizeof(pre));
int flag=0,max=0;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(flag==0){
int x,y;
x=find(u),y=find(v);
if(x==y){
printf("YES\n");
flag=1;
}
else{
lenth[x]+=lenth[y]+w;
if(lenth[x]>max){
max=lenth[x];
}
pre[y]=x;
}
}
}
if(flag==0)
printf("%d\n",max);
}
return 0;
}