HDOJ 3586 Information Disturbing

来源:互联网 发布:鲍里斯三世知乎 编辑:程序博客网 时间:2024/06/06 20:24

给一颗树,1为根节点,要切断1与所有叶子的联系,每条边有权值,给定权值总和上限,求在给定总和上限内切断单条边权值中最大值的最小值。

二分上限即可。存储边长的数组在空间有限制时可以在树节点中存储。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n,m,idx;int sum[1005],mx[1005],c[1005][1005];//可以换到下面struct Node{//int len;存储两节点间边长;    int v;    Node *next;}*head[2010],tree[2010];void init(){    idx=1;    for(int i=0;i<=n;i++)    {        tree[i].v=i;        tree[i].next=NULL;        head[i]=NULL;        for(int j=0;j<=n;j++)        {            c[i][j]=0;        }    }}void add(int x,int y){    tree[idx].v=y;    tree[idx].next=head[x];    head[x]=&tree[idx++];    tree[idx].v=x;    tree[idx].next=head[y];    head[y]=&tree[idx++];}void Find(int rt,int par,int ul){    Node *p=head[rt];    while(p!=NULL)    {        if(p->v!=par)        {            if(mx[rt]==0)mx[rt]=c[rt][p->v];            else mx[rt]=max(mx[rt],c[rt][p->v]);            Find(p->v,rt,ul);            if(c[rt][p->v]<=ul)            {                if(mx[p->v]<=ul&&sum[p->v]!=0)                {                    sum[rt]+=min(sum[p->v],c[rt][p->v]);                }                else sum[rt]+=c[rt][p->v];            }            else            {                if(mx[p->v]<=ul&&sum[p->v]!=0)                {                    sum[rt]+=sum[p->v];                }                else sum[rt]=1000000;            }            if(sum[rt]>=1000000)sum[rt]=1000000;        }        p=p->next;    }}int main(){    while(scanf("%d%d",&n,&m),n||m)    {        init();        int x,y,w;        for(int i=1;i<n;i++)        {            scanf("%d%d%d",&x,&y,&w);            c[x][y]=w;            c[y][x]=w;            add(x,y);        }        int l=0,r=n,mid,ans=-1;        while(l<=r)        {            memset(sum,0,sizeof(sum));            memset(mx,0,sizeof(mx));            mid=(l+r)>>1;            Find(1,0,mid);            if(sum[1]<=m&&sum[1]!=0)            {                r=mid-1;                ans=mid;            }            else l=mid+1;        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击