(并查集+树形DP) hdu 4514
湫湫系列故事——设计风景线
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3269 Accepted Submission(s): 587
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 3
1 2 1
2 3 1
3 1 1
Sample Output
YES
Source
DP求树上最长链
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int v,w;
node(int _v, int _w) : v(_v), w(_w) {}
};
vector<node> e[100001];
int n,m,fa[100001],dp[100001],ans;
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void dfs(int u,int father)
{
int maxx=0;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i].v;
int w=e[u][i].w;
if(v==father)
continue;
dfs(v,u);
ans=max(ans,dp[v]+maxx+w);
maxx=max(maxx,dp[v]+w);
}
dp[u]=maxx;
}
void slove()
{
for(int i=1;i<=n;i++)
{
if(dp[i]==-1)
dfs(i,-1);
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
bool flag=false;
ans=0;
for(int i=1;i<=n;i++)
fa[i]=i,dp[i]=-1,e[i].clear();
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
e[x].push_back(node(y,z));
e[y].push_back(node(x,z));
if(flag)
continue;
int fx,fy;
fx=find(x),fy=find(y);
if(fx!=fy)
{
fa[fx]=fy;
}
else
{
flag=true;
continue;
}
}
if(flag)
{
printf("YES\n");
continue;
}
slove();
}
return 0;
}
浙公网安备 33010602011771号