• (并查集+树形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。
     
    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
     

    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
    ",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
    ");
                continue;
            }
            slove();
        }
        return 0;
    }
    

      

  • 相关阅读:
    GLSL 变量属性
    php读取大文件的方法
    php 3种常见设计模式
    php类自动装载、链式操作、魔术方法
    统计文件中关键词出现的次数
    python先序、中序、后序排序
    Nginx缓存、压缩配置
    Ninx虚拟主机的配置
    python爬虫代码
    Nginx在安装过程经常出现的问题
  • 原文地址:https://www.cnblogs.com/water-full/p/4493765.html
Copyright © 2020-2023  润新知