腾讯马拉松去打了下酱油,有一道水题没搞出来,题目意思理解不清楚,原来是用并查集。
题目中最长的路线,就是并查集以后树的干的权重和,开始一直以为要一遍遍历,原来没有此要求。
如果新加进来的两个节点属于同一个集合,那么就输出yes。
#include<iostream>
using namespace std;
int bin[100005];
int n,m,flag;
int sum[100005];
int find(int x)
{
int r=x;
while(bin[r]!=r)
r=bin[r];
return r;
}
void merge(int x,int y,int value)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
if(sum[fx]>=sum[fy])
{
bin[fy]=fx;
sum[fx]+=value;
}
else
{
bin[fx]=fy;
sum[fy]+=value;
}
}
}
void Init()
{
int i,u,v,w;
flag=0;
for(i=0;i<=n;i++)
bin[i]=i;
memset(sum,0,sizeof(sum));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(find(u)==find(v))flag=1;
else
{
// printf("**%d %d\n",find(u),find(v));
merge(u,v,w);
}
}
}
void solve()
{
int i,mmax=-1;
if(flag==1)printf("YES\n");
else
{
for(i=1;i<=n;i++)
if(sum[i]>mmax)mmax=sum[i];
printf("%d\n",mmax);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
Init();
solve();
}
return 0;
}
HDU_4514湫湫系列故事——设计风景线
最新推荐文章于 2018-09-23 08:30:31 发布