树的直径和并查集判环
来源:互联网 发布:阿里云ubuntu中文乱码 编辑:程序博客网 时间:2024/05/29 10:24
#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#define maxn 2000001#define maxe 100001using namespace std;int n,m;int first[maxe],nxt[maxn],to[maxn],e,cost[maxn];int fa[maxe];void add(int u,int v,int c){ to[e]=v;cost[e]=c;nxt[e]=first[u];first[u]=e++;}int finds(int x){ if(fa[x]==x)return fa[x]; else return fa[x]=finds(fa[x]);}void unit(int a,int b){ int x=finds(a); int y=finds(b); if(x==y)return ; else fa[x]=y; return ;}int d[maxe];int bfs(int s){ memset(d,-1,sizeof d); queue<int>q; q.push(s); d[s]=0; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=first[u];~i;i=nxt[i]){ int v=to[i]; if(d[v]==-1){ d[v]=d[u]+cost[i]; q.push(v); } } } int id=-1; for(int i=1;i<=n;i++){ if(id==-1||d[i]>d[id])id=i; } return id;}int maxlen(int s){ int a=bfs(s); int b=bfs(a); return d[b];}int main(){ int u,v,c; freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF){ bool flag=false; e=0; memset(first,-1,sizeof first); for(int i=1;i<=n;i++) fa[i]=i; for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&c); add(u,v,c); add(v,u,c); if(finds(u)==finds(v))flag=true; unit(u,v); } if(flag)puts("YES"); else{ printf("%d\n",maxlen(1)); } }}
湫湫系列故事——设计风景线
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3218 Accepted Submission(s): 578
Problem Description
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
Input
测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。
[Technical Specification]
1. n<=100000
2. m <= 1000000
3. 1<= u, v <= n
4. w <= 1000
接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。
[Technical Specification]
1. n<=100000
2. m <= 1000000
3. 1<= u, v <= n
4. w <= 1000
Output
对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
Sample Input
3 31 2 12 3 13 1 1
Sample Output
YES
0 0
- 树的直径和并查集判环
- 树的直径和重心
- UVALive 5026 (树的重心和直径)
- 求树的直径端点和距离
- hdoj 4514 并查集 树的直径
- hdoj 4514 并查集 树的直径 (二)
- Codeforces 455C Civilization 树的直径+并查集
- 【树的直径+并查集】 codeforces 455C - Civilization
- coderforces 455C 并查集+树的直径
- bzoj3124 [Sdoi2013]直径 树的直径
- 【树的直径】
- 树的直径
- 求树的直径
- 树的最长直径
- HDU4607 树的直径
- URAL1056(树的直径)
- 树的直径hdu3721
- 树的直径
- hdoj 2063 过山车
- Java—"==" 与 equals区别
- Deep Learning L教程(矢量化编程)(一)
- poj 1045/3299 数学公式推导(欧姆定律/湿度值)
- Deep Learning L教程(矢量化编程实现)(二)
- 树的直径和并查集判环
- Deep Learning L教程(矢量化编程实现)(三)
- 全排列,回溯
- poj 2136 打印字母的树状图
- HDU 1166 敌兵布阵
- 【POJ 2386】 Lake Counting
- poj 1062 最短路(昂贵的聘礼)
- iptables防火墙原理详解
- MVC,MVP 和 MVVM 的图示