NOIP 2012 Day2 T3 疫情控制

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bitset>
using namespace std;
struct data
{
    int l;
    long long w;
};
    data k,need[50005];
vector <data> city[1005];
int n,m,a,b,ans,kk,cnt;
int tt,ff;
long long c,mid,l=1,r;
long long lt[50005],send[50005];
int zz[50005],army[50005],dis[50005][20],f[50005][20];
int dep[50005],stay[50005],one[50005],g[50005][2],sec[50005];
bool vis[50005],vis2[50005],p[50005];
bool comp(data x,data y)
{
    if (x.w>=y.w)  return true;
    return false;
}
bool comp2(int x,int y)
{
    if (x>=y)  return true;
    return false;
}
void dfs(int x)
{
    vis[x]=true;
    for (int i=0;i<city[x].size();i++)
        if (!vis[city[x][i].l])
        {
            dep[city[x][i].l]=dep[x]+1;
            dis[city[x][i].l][0]=city[x][i].w;
            f[city[x][i].l][0]=x;
            dfs(city[x][i].l);
        }
}
void init()
{//here
    for (int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
        {
            f[i][j]=f[f[i][j-1]][j-1];
            dis[i][j]=dis[f[i][j-1]][j-1]+dis[i][j-1];
        }
}
void up(int x,int s)
{
    for (int i=0;dis[x][i]<=lt[s];i++)
    {
        p[x]=false;
        x=f[x][i];
        p[x]=true;
        army[s]=x;
        lt[s]-=dis[x][i];
        if (lt[s]<lt[stay[x]])  stay[x]=s;
        if (dep[x]==2)  return ;
    }
    return ;
}
int dfs2(int x)
{
    int s=0;
    vis2[x]=true;
    for (int i=0;i<city[x].size();i++)
        if (!vis2[city[x][i].l])
        {
            dfs2(city[x][i].l);
            if (p[city[x][i].l]==false)  break;
            else  s++;
        }
    if (s==city[x].size()){p[x]=true;return 2;}
    if (p[x]==true)  return 1;
    return 0;
}
int ss()
{
    if (ff<tt) return 0;
    sort(need+1,need+1+tt,comp);
    sort(send+1,send+1+ff,comp2);
    for (int i=1;i<=tt;i++)
        if (need[i].w>send[i])  return 1;
    return 0;
}
int check()
{
    tt=0,ff=0;
    vis2[1]=true;
        for (int i=0;i<city[1].size();i++)
        {
            int t=dfs2(city[1][i].l);
            one[city[1][i].l]=t;
            if (t==0){
                need[++tt].l=city[1][i].l;
                need[tt].w=city[1][i].w;
            }
        }
    for (int i=1;i<=m;i++)
        if (dep[army[i]]==2)
        {
            if (one[army[i]]==1&&stay[army[i]]!=i)
            {
                if (lt[i]-g[i][0]>=0)
                {
                    lt[i]-=g[i][0];
                    send[++ff]=lt[i];
                }
            }
            if (one[army[i]]==2&<[i]-g[i][0]>=0)
            {
                lt[i]-=g[i][0];
                    send[++ff]=lt[i];
            }
        }
    return ss();
}
int main()
{
    freopen ("blockade.in","r",stdin);
    //freopen ("blockade.out","w",stdout);
    scanf ("%d",&n);
    for (int i=1;i<=n-1;i++)
    {
        scanf ("%d%d%lld",&a,&b,&c);
        k.l=b;k.w=c;city[a].push_back(k);
        k.l=a;k.w=c;city[b].push_back(k);
        r+=c;
        if (a==1||b==1)  kk++;
    }
    scanf ("%d",&m);
    if (m<kk){printf ("-1");return 0;}
    for (int i=1;i<=m;i++)
    {
        scanf ("%d",&a);
        zz[++cnt]=a;
        army[cnt]=a;
        p[a]=true;
    }
    vis[1]=true;
    for (int i=0;i<city[1].size();i++)
    {
        g[city[1][i].l][0]=city[1][i].w;
        f[city[1][i].l][0]=city[1][i].l;
        dep[city[1][i].l]=2;
        dfs(city[1][i].l);
    }
    init();//here
    lt[0]=1e14;
    while (l<r)
    {
        mid=(l+r)>>1;
        for (int i=1;i<=cnt;i++)
        {
            lt[zz[i]]=mid;
            up(zz[i],i);
        }
        if (check())  l=mid+1;//and here
        else r=mid;
    }
    printf ("%d",r);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值