HDOJ4514 并查集判环+BFS求最长路
来源:互联网 发布:西安行知中学杨凌分校 编辑:程序博客网 时间:2024/09/21 08:18
湫湫系列故事——设计风景线
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 5286 Accepted Submission(s): 973
Problem Description
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
现在已经勘探确定了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
Output
对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
Sample Input
3 3
1 2 1
2 3 1
3 1 1
Sample Output
YES
Source
2013腾讯编程马拉松初赛第二场(3月22日)
Recommend
liuyiding | We have carefully selected several similar problems for you: 6193 6192 6191 6190 6189
判断是否成环用并查集,若两个点的父亲一样那么环存在。
最长路简单的宽搜就可以了。
注意开的数组规模。。开小了就一直没AC。。
#include <iostream>#include <cstring>#include <ctime>#include <cmath>#include <queue>using namespace std;const int maxn = 1e5+5;const int maxm = 2e6+5;int head[maxn],f[maxn],dis[maxn];bool vis[maxn],used[maxn],flag;int i,j,k,tot,max_len,m,n;struct node{ int to,next,len;}edge[maxm];queue<int>que;void add_edge(int u, int v, int w){ edge[tot].next = head[u]; edge[tot].to = v; head[u] = tot; edge[tot].len = w; tot++;}int Find(int x){ if (f[x]==x) return x; return f[x] = Find(f[x]);}void Merge(int x, int y){ int fx = Find(x), fy = Find(y); f[fx] = fy;}void init(){ int u,v,w; tot = 0; flag = 0; max_len = 0; for (i=0; i<=n; i++) {f[i] = i; head[i] = -1; used[i] = 0;} for (i=0; i<m; i++) { cin >> u >> v >> w; add_edge(u,v,w); add_edge(v,u,w); if (Find(u)!=Find(v)) Merge(u,v); else flag = 1; }}void bfs(int s){ memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); while(!que.empty()) que.pop(); que.push(s); vis[s] = 1; int u,v; while (!que.empty()) { u = que.front(); used[u] = 1; que.pop(); for (int i=head[u]; i!=-1; i=edge[i].next){ v = edge[i].to; if (!vis[v]) { dis[v] = dis[u]+edge[i].len; vis[v] = 1; que.push(v); } } }}void work(int s){ int pos = s,maxl = 0; bfs(s); for (int k=1; k<=n; k++) if (dis[k]>maxl) { maxl = dis[k]; pos = k; } bfs(pos); for (int k=1; k<=n; k++) max_len = max(max_len,dis[k]);}int main(){ std::ios::sync_with_stdio(false); while (cin >> n >> m) { init(); if (flag) cout << "YES" << endl; else { for (i=1; i<=n; i++) if (!used[i]) work(i); cout << max_len << endl; } } return 0;}
- HDOJ4514 并查集判环+BFS求最长路
- hust1608 Dating With Girls hust校赛 BFS求最长路
- HOJ 1030 Labyrinth----------------两次BFS求树的直径(图的最长路)
- POJ 1985 Cow Marathon(两次BFS求树的直径(最长路))
- 【POJ1383】BFS,迷宫,最长路
- 求最长回文字符串并原样输出
- 关于求最长路
- spfa求最长路
- POJ 1383 Labyrinth(两次bfs求最长路径)
- HDU 4514并查集判环+最长路
- POJ 2631 最长路搜索,BFS
- #1050 : 树中的最长路(两次BFS)
- hdu3696(spfa求最长路)
- 求DAG最长路 板子
- 1021. Deepest Root (25) -并查集判树 -BFS求深度
- 线段树求LIS并统计最长子序列个数
- 求最长递增子序列长度并输出序列
- 求最长的升序子序列 并将最长的升序子序列输出
- 美发店员工合同WORD版(可直接下载打印)【卓美业网拓软件整理】
- ECMAScript 6:展开运算符 ...
- 关于新生成的物体生命周期执行顺序问题
- 双向分析Java面试
- EJB到底是什么?
- HDOJ4514 并查集判环+BFS求最长路
- ARP 地址解析协议
- 树状数组
- 这是 CCNA 重点吗?
- Tips of UnityShader
- Discuz!X3 修改在线人数在线会员以及统计数据的方法
- 设计模式
- Distribute Candies
- linux 命令