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

 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\n",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\n",ans,maxson);
54     }
55 }
View Code

 

posted @ 2017-08-12 10:15  yijiull  阅读(120)  评论(0编辑  收藏  举报