HDU ACM 4514 湫湫系列故事——设计风景线->树上环的判断+树上最长路

题意:一个无向图,首先判定是否成环,然后求一条最长链。

分析:成环用并查集判断,最长链就是树形dp了。

#include<iostream>
#include<vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define N 100005
int ans;
int dp[N];   //dp[i]表示i节点为根节点树的最长路
int p[N];

struct Edge
{
	Edge(int _v,int _f):v(_v),f(_f){}
	int v,f;
};
vector<Edge> map[N];
#define max(a,b) ((a)>(b)?(a):(b))

int Find(int x)
{
	return x==p[x]?x:x=Find(p[x]);
}

void dfs(int p,int u)  //u是父节点,v是子节点
{
	int maxtmp,i,v,f;

	maxtmp=0;
	for(i=0;i<map[u].size();i++)
	{
		v=map[u][i].v;
		f=map[u][i].f;
		if(v==p) continue;
		dfs(u,v);
		ans=max(ans,dp[v]+f+maxtmp);    //ans计算以u为根节点的两棵最长子树权值的和
		maxtmp=max(maxtmp,dp[v]+f);
	}
	dp[u]=maxtmp;
}

int main()
{
	int n,m,a,b,c,x,y,i;
	bool loop;

	while(scanf("%d%d",&n,&m)==2)
	{
		ans=0;
		loop=false;
		for(i=1;i<=n;i++)
		{
			dp[i]=-1;
			p[i]=i;
			map[i].clear();
		}
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(loop) continue;
			x=Find(a);
			y=Find(b);
			if(x!=y) p[x]=y;
			else
			{
				loop=true;
				continue;
			}
			map[a].push_back(Edge(b,c));
			map[b].push_back(Edge(a,c));
		}
		if(loop)
		{
			puts("YES");
			continue;
		}
		for(i=1;i<=n;i++)             //防止树不是连通的
			if(dp[i]==-1) dfs(0,i);
		printf("%d\n",ans);
	}
    return 0;
}
时间: 2024-10-10 01:49:42

HDU ACM 4514 湫湫系列故事——设计风景线->树上环的判断+树上最长路的相关文章

HDU4514湫湫系列故事——设计风景线(并查集判环+最长直径)

题目链接:传送门 题意: 先判一个图是否存在换,不存在的话输出这个图的最长路径. 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> using namespace std; const int maxn = 1e6+10; int par[maxn/10],head[maxn/10]; bool

HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4669    Accepted Submission(s): 853 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形

hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 562 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

HDU - 4514 湫湫系列故事――设计风景线

Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少? 其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描

hdu 4514 湫湫系列故事――设计风景线(求树的直径)

随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?  其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述:  接下去m行,

HDU - 4514 湫湫系列故事——设计风景线(并查集判环+树形DP)

题目链接:https://vjudge.net/problem/HDU-4514 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?  其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有

HDU - 4514 湫湫系列故事——设计风景线(并查集判环)

题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少? 其中,可以兴建的路线均是双向的,他们之间的长度均大于0. 思路: 将给出的边的两个端点用并查集放在一起,如果这两个点的祖先相等说明构成了一个环. 在这个用并查

HDU 4514 湫湫系列故事――设计风景线 (树形DP)

题意:略. 析:首先先判环,如果有环直接输出,用并查集就好,如果没有环,那么就是一棵树,然后最长的就是树的直径,这个题注意少开内存,容易超内存, 还有用C++交用的少一些,我用G++交的卡在32764K,限制是32768K.. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib&

HDU ACM 4515 小Q系列故事——世界上最遥远的距离

分析:最容易的方法就是一天一天的模拟了. #include<iostream> using namespace std; int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; #define Y 2013 #define M 3 #define D 24 bool leap(int y) { return y%400==0 || y%4==0&&y%100!=0; } void change(int k,int fg) //-1回到过