zoukankan      html  css  js  c++  java
  • hdu4514(非连通图的环判断与图中最长链)(树的直径)

    湫湫系列故事——设计风景线

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。 
      现在已经勘探确定了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

    题解:就是判环,如果无环的话就求出树的直径,如果有环的话就输出YES,就可以了,记录一个最
    长路,和次长路,就ok了。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #define N 100007
     8 #define M 1000007
     9 using namespace std;
    10 
    11 int n,m,ans;
    12 int cnt,head[N],Next[M*2],rea[M*2],val[M*2];
    13 int f[N][3],fa[N];
    14 bool vis[N];
    15 
    16 void Add(int u,int v,int fee){Next[++cnt]=head[u],head[u]=cnt,rea[cnt]=v,val[cnt]=fee;}
    17 int find(int num)
    18 {
    19     if (fa[num]!=num) return fa[num]=find(fa[num]);
    20     return fa[num];
    21 }
    22 void dfs_solve(int u,int fa)
    23 {
    24     for (int i=head[u];i!=-1;i=Next[i])
    25     {
    26         int v=rea[i],fee=val[i];
    27         if (v==fa||vis[v]) continue;
    28         vis[v]=1;dfs_solve(v,u);
    29         if (f[v][1]+fee>f[u][1])
    30         {
    31             f[u][2]=f[u][1];
    32             f[u][1]=f[v][1]+fee;
    33         }
    34         else if (f[v][1]+fee>f[u][2]) f[u][2]=f[v][1]+fee;
    35     }
    36     ans=max(ans,f[u][1]+f[u][2]);
    37 }
    38 int main()
    39 {
    40     while (~scanf("%d%d",&n,&m))
    41     {
    42         ans=cnt=0;
    43         bool flag=0;
    44         memset(vis,0,sizeof(vis));
    45         memset(head,-1,sizeof(head));
    46         memset(f,0,sizeof(f));
    47         for (int i=1;i<=n;i++) fa[i]=i;
    48         for (int i=1,x,y,z;i<=m;i++)
    49         {
    50             scanf("%d%d%d",&x,&y,&z);
    51             if (flag) continue;
    52             int u=find(x),v=find(y);
    53             if (u==v)
    54             {
    55                 flag=1;
    56                 printf("YES
    ");
    57             }
    58             else fa[u]=v;
    59             Add(x,y,z),Add(y,x,z);
    60         }
    61         if (flag) continue;
    62         ans=-1;
    63         for (int i=1;i<=n;i++)
    64         {
    65             if (!vis[i])
    66             {
    67                 vis[i]=1;
    68                 dfs_solve(i,-1);
    69             }
    70         }
    71         printf("%d
    ",ans);
    72     }
    73 }
  • 相关阅读:
    苹果输入手机号变用户的名字
    iOS 关于UITableView的黑科技
    iOS 详解NSObject协议
    iOS 用xib自定义View
    iOS 关于定位你该注意的那些事
    iOS 内存泄漏
    Swift应用案例 2.闭包入门到精通
    Swift应用案例 1.无限轮播
    多库共存-冲突问题
    多库共存-冲突问题
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7701017.html
Copyright © 2011-2022 走看看