zoukankan      html  css  js  c++  java
  • 湫湫系列故事——设计风景线

     HDU - 4514 

    并查集判环+树的直径。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxe=1000010;
     4 const int maxv=100010;
     5 
     6 int n,m;
     7 int ans;
     8 int f[maxv];
     9 int vis[maxv];
    10 
    11 struct Edge{
    12     int v,w,nex;
    13 }e[maxe<<1];
    14 int head[maxv];
    15 int cnt=0;
    16 void init(){
    17     memset(head,-1,sizeof(head));
    18     cnt=0;
    19 
    20     for(int i=0;i<=n;i++) f[i]=i;  //
    21 }
    22 void add(int u,int v,int w){
    23     e[cnt].v=v;
    24     e[cnt].w=w;
    25     e[cnt].nex=head[u];
    26     head[u]=cnt++;
    27 }
    28 int gf(int x){
    29     return x==f[x]?x:f[x]=gf(f[x]);
    30 }
    31 int uni(int a,int b){
    32     int pa=gf(a);
    33     int pb=gf(b);
    34     if(pa==pb){
    35         return 1;
    36     }else{
    37         f[pa]=pb;
    38         return 0;
    39     }
    40 }
    41 int dfs(int u ,int pre){
    42     int d;
    43     int md1=0,md2=0;
    44     for(int i=head[u];i!=-1;i=e[i].nex){
    45         if(e[i].v==pre) continue;
    46         d=dfs(e[i].v,u)+e[i].w;
    47         if(d>md1){
    48             md2=md1;
    49             md1=d;
    50         }else if(d>md2){
    51             md2=d;
    52         }
    53     }
    54     ans=max(ans,md1+md2);
    55     return md1;
    56 }
    57 int main(){
    58     while(scanf("%d%d",&n,&m)!=EOF){
    59         init();
    60         int u,v,w;
    61         int flag=0;
    62         for(int i=0;i<m;i++){
    63             scanf("%d%d%d",&u,&v,&w);
    64             if(!flag) {
    65                 flag=uni(u,v);
    66                 add(u,v,w);
    67                 add(v,u,w);
    68             }
    69         }
    70         if(flag) {
    71             puts("YES");
    72             continue;
    73         }
    74         ans=0;
    75         memset(vis,0,sizeof(vis));
    76         for(int i=1;i<=n;i++){
    77             int rt=gf(i);
    78             if(!vis[rt]){
    79                 vis[rt]=1;
    80                 dfs(i,0);
    81             }
    82         }
    83         printf("%d
    ",ans);
    84     }
    85     return 0;
    86 }
    View Code

    Balancing Act

     POJ - 1655 

    题意:删除树上的一个点,使得生成的树中最多点最少。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int maxn=20010;
     6 const int inf=1<<30;
     7 int n,son[maxn];
     8 int ans,maxson;
     9 struct edge{
    10     int v,nex;
    11 }e[maxn<<1];
    12 int head[maxn];
    13 int cnt=0;
    14 void add(int u,int v){
    15     e[cnt].v=v;
    16     e[cnt].nex=head[u];
    17     head[u]=cnt++;
    18 }
    19 void init(){
    20     cnt=0;
    21     maxson=inf;
    22     memset(head,-1,sizeof(head));
    23 }
    24 void dfs(int u,int f){
    25     son[u]=0;
    26     int temp=0;
    27     for(int i=head[u];i!=-1;i=e[i].nex){
    28         int v=e[i].v;
    29         if(v==f) continue;
    30         dfs(v,u);
    31         son[u]+=son[v]+1;
    32         temp=max(temp,son[v]+1);
    33     }
    34     temp=max(temp,n-son[u]-1);
    35     if(temp<maxson||temp==maxson&&u<ans){
    36         ans=u;
    37         maxson=temp;
    38     }
    39 }
    40 int main(){
    41     int t;
    42     scanf("%d",&t);
    43     while(t--){
    44         init();
    45         scanf("%d",&n);
    46         for(int i=1;i<n;i++){
    47             int u,v;
    48             scanf("%d%d",&u,&v);
    49             add(u,v);
    50             add(v,u);
    51         }
    52         dfs(1,0);
    53         printf("%d %d
    ",ans,maxson);
    54     }
    55 }
    View Code
  • 相关阅读:
    4、2 核心组件
    promise
    Content-Type
    $routeProvider
    广告
    $apply() $digest()
    异常
    switch
    autoprefixer
    $resource
  • 原文地址:https://www.cnblogs.com/yijiull/p/7349106.html
Copyright © 2011-2022 走看看