湫湫系列故事——设计风景线
并查集判环+树的直径。
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 }
Balancing Act
题意:删除树上的一个点,使得生成的树中最多点最少。
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 }