标签:priority style name 大于 algo 线性 content 答案 font
7 2
6 7
3 4
6 5
1 2
3 2
4 5
2
solution:
最大值最小一看就二分,但注意用一下大根堆,只要有边权值大于当前二分的答案,++now,如果now>s,return false;
如果最大值和次大值相加大于二分的答案,++now,不过二分的右边界需要设置成v/s,否则会T一个点。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 #define root 1 8 int read() { 9 int s=0,f=1; 10 char ch=getchar(); 11 for( ; ch<‘0‘||ch>‘9‘; f=(ch==‘-‘)?(-1):f,ch=getchar()) ; 12 for( ; ch>=‘0‘&&ch<=‘9‘; s=(s<<1)+(s<<3)+(ch^48),ch=getchar()) ; 13 return s*f; 14 } 15 int now,v,s,tot,r[100005],deep[100005],siz[100005]; 16 int fir_dep[100005],sec_dep[100005]; 17 struct edge { 18 int to,next; 19 } c[200005]; 20 void add(int x,int y) { 21 c[tot]=(edge) { 22 y,r[x] 23 }; 24 r[x]=tot++; 25 } 26 int dfs1(int u,int v) { 27 siz[u]=1; 28 fir_dep[u]=sec_dep[u]=deep[u]=deep[v]+1; 29 for(int i=r[u]; ~i; i=c[i].next) { 30 if(c[i].to!=v) { 31 deep[c[i].to]=deep[u]+1; 32 int dep=dfs1(c[i].to,u); 33 if(dep>fir_dep[u]) { 34 sec_dep[u]=fir_dep[u]; 35 fir_dep[u]=dep; 36 } 37 siz[u]+=siz[c[i].to]; 38 } 39 } 40 return fir_dep[u]; 41 } 42 priority_queue <int> q[100005]; 43 bool dfs(int len,int u,int v) { 44 if(siz[u]==1) { 45 q[v].push(1); 46 return true; 47 } 48 while(!q[u].empty()) { 49 q[u].pop(); 50 } 51 q[u].push(0); 52 for(int i=r[u]; ~i; i=c[i].next) { 53 if(c[i].to!=v) { 54 bool pd=dfs(len,c[i].to,u); 55 if(!pd) { 56 return false; 57 } 58 } 59 } 60 while(!q[u].empty()&&q[u].top()!=0) { 61 int num=q[u].top(); 62 q[u].pop(); 63 if(num>len) { 64 ++now; 65 if(now>s) { 66 return false; 67 } 68 continue; 69 } 70 if(num+q[u].top()>len) { 71 ++now; 72 if(now>s) { 73 return false; 74 } 75 } else { 76 q[u].push(num); 77 break; 78 } 79 } 80 q[v].push(q[u].top()+1); 81 return true; 82 } 83 int main() { 84 memset(r,0xff,sizeof(r)); 85 v=read(),s=read(); 86 for(int x,y,i=1; i<v; ++i) { 87 x=read(),y=read(); 88 add(x,y),add(y,x); 89 } 90 dfs1(root,0); 91 int l=1,r=v/s+1; 92 while(l<r) { 93 int mid=(l+r)>>1; 94 now=0; 95 bool dd=dfs(mid,root,0); 96 if(now>s) { 97 l=mid+1; 98 } else { 99 r=mid; 100 } 101 } 102 printf("%d",l); 103 return 0; 104 }
标签:priority style name 大于 algo 线性 content 答案 font
原文地址:http://www.cnblogs.com/forevergoodboy/p/7516255.html