P1084 疫情控制

Posted sfwr-you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1084 疫情控制相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
struct node
    int nxt,dis,to;
eg[51000*2];
#define ll long long
void adde(int from,int to,int dis)

    eg[++ne].to=to;
    eg[ne].dis=dis;
    eg[ne].nxt=head[from];
    head[from]=ne;

struct ndint it,re;num[51000];
int cmp(nd x,nd y)return x.re<y.re;
int cmp2(int a,int b)return d[a][0]<d[b][0];
int n,head[51000],m,ne,fa[51000][22],d[51000][22]a,b,c,id[51000],q[51000];
int se[51000];
int dfs(int u,int f)
    for(int i=head[u];i;i=eg[i].nxt)
    
        int v=eg[i].to;
        if(v==fa)continue;
        fa[v][0]=u;
        d[v][0]=eg[i].dis;
        dfs(v,u);
    

int dfs2(int u,int f)
    int t=0
    for(int i=head[u];i;i=eg[i].nxt)
    
        int v=eg[i].to;
        if(v==fa)continue;
        t++;
        dfs(v,u);
    
    if(!cnt)se[u]=1;

int dfs3(int u,int f)
    if(!bol)
    
    int t=0
    for(int i=head[u];i;i=eg[i].nxt)
    
        int v=eg[i].to;
        if(v==fa)continue;
        t++;
        dfs(v,u);
    
    if(!cnt)if(!se[u])bol=1;    
    

int check(int w)

    int cnt=0;
    for(int i=1;i<=m;i++)
    
        ll rest=w;
        int di=id[i],flg=0;
        for(int j=22;j>=0;j--)
        
            if(rest-d[di][j]>=0)
            
                if(fa[di][j]==1)flg=1,break;
                else rest-=d[di][j];
            
          
        if(!flg)
        dfs2(di,fa[di][0]);
        else 
            if(rest<2*d[di][0])
            dfs2(di,fa[di][0]);
            else 
            num[++cnt].it=di;
            num[cnt].re=rest-d[di][0];
                
        
    
    int sum=0;
    for(int i=head[1];i;i=eg[i].nxt)
    
        bol=0;
        dfs3(eg[i].to,1);
        if(bol)q[++sum]=eg[i].to;
    
    sort(num+1,num+1+cnt,cmp);
    sort(q+1,q+1+sum,cmp2);
    

int main()

    long long r=0;
    cin>>n;
    for(int i=1;i<n;i++)
    
        cin>>a>>b>>c;
        adde(a,b,c);
        adde(b,a,c);
        ans+=c;
    
    cin>>m;
    for(int i=1;i<=m;i++)cin>>id[i];
    fa[1][0]=1;
    dfs(1,1);
    for(int i=1;i<=22;i++)
    for(int j=1;j<=n;j++)
    d[j][i]=d[j][i-1]+d[fa[j][i-1]][i-1];
    long long l=0,mid;
    while(l<=r)
    mid=(l+r)>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    
    cout<<r;
    

 

以上是关于P1084 疫情控制的主要内容,如果未能解决你的问题,请参考以下文章

P1084 疫情控制

P1084 疫情控制

Luogu P1084 疫情控制 | 二分答案 贪心

P1084 疫情控制

洛谷P1084 疫情控制

洛谷 P1084 疫情控制 题解