码迷,mamicode.com
首页 > 其他好文 > 详细

计算客 自建物流的wu人机实验(简单)(状态压缩+LCA)

时间:2015-07-19 11:53:59      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:图论   算法   压缩   

作为一个电子商务作为主体的公司,京东一直努力实现着自己“多、快、好、省”的承诺。其中,“快”的特质更是被京东发挥到了极致。京东建立了层级分明的物流网络,然后除了在社区里面的到户物流点,每个作为中转的物流点都是有下属的物流点的。每个物流点都有一定数量的快递员,他们每天都辛苦的在外奔波。

京东计划给一些物流点配备一种新式的无人机,用于进行货物中转、配送。因为这种无人机还在试验期,京东对每个参与测试的物流点最多都只配备一台无人机。负责这个试验的东东希望设计一种分配无人机的方案,使得对于任何一个物流点 X,以它作为最近公共上级的分配了无人机的物流点对数不小于物流点 X 的快递员数。为了节约试验预算,东东希望需要分配的无人机数量越小越好。你能帮他们求出一种分配无人机的方案吗?

技术分享
输入第一行是一个整数 n,代表京东的物流点个数。输入格式

第二行是 n 个整数,第 i 个整数代表编号为 i 的京东物流点的快递员数量 valuei(0 ≤ valuei ≤ 1018)。

接下来 n-1 行,每行有2个整数 x 和 y(1 ≤ x, y ≤ n),代表物流 x 和物流点 y 之间是上下级关系(即物流点 x 是物流点 y 的上级,或物流点 y 是物流点 x 的上级)。

数据可以确保最终会形成一个树形网络,编号为 1 的物流点是没有上级的物流核心节点(树的根)。

对于简单版本,1 ≤ n ≤ 10;

对于中等版本,1 ≤ n ≤ 2000;

对于困难版本,1 ≤ n ≤ 200000。

输出格式

如果对于给定的输入存在一个可以满足要求的分配无人机的方案,则第一行输出一个整数 ans,代表最少需要多少个无人机;若 ans 不为 0,则第二行输出 ans 个整数,代表最少的方案中需无人机的 ans 个结点的编号,编号需要从小到大输出,每两个相邻整数之间有一个空格,行末没有空格(若存在多组符合要求的方案,输出任意一组即可);若 ans 为 0,则不用输出第二行。

如果不存在满足的方案,则只在第一行输出 -1 即可。

样例1

输入:

5
6 0 0 0 0
1 2
2 3
1 4
1 5

输出:

4
1 2 4 5

提示信息

样例 1 中 1、2、4、5 这四个点两两之间共有 6 个点对,分别是(1, 2), (1, 4), (1, 5), (2, 4), (2, 5), (4, 5),它们的最近公共上级全都是 1。满足要求的方案还有 1、3、4、5。

如果有多种最小方案,输出任意一组即可。

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int N = 20;
const int INF = 1<<30;
struct EDG{
    int to,next;
}edg[N*N];

int eid,head[N];
int k,fath[N],vist[N],f[N][N];
vector<int>mapt[N];

void addEdg(int u,int v){
    edg[eid].to=v; edg[eid].next=head[u]; head[u]=eid++;
    edg[eid].to=u; edg[eid].next=head[v]; head[v]=eid++;
}
int findfath(int x){
    if(x!=fath[x])
        fath[x]=findfath(fath[x]);
    return fath[x];
}
void dfs(int u){
    fath[u]=u;
    vist[u]=1;
    for(int i=mapt[u].size()-1; i>=0; i--)
    {
        int v=mapt[u][i];
        if(vist[v]==0)continue;
        f[u][v]=findfath(v);
        //printf("%d %d %d\n",u,v,f[u][v]);
    }
    for(int i=head[u]; i!=-1; i=edg[i].next){
        int v=edg[i].to;
        if(vist[v])continue;
        dfs(v);
        fath[v]=u;
    }
}
int main()
{
    int n,u,v;
    long long val[N],hase[N];
    while(scanf("%d",&n)>0){
        eid=0;
        memset(head,-1,sizeof(head));
        for(int i=1; i<=n; i++)
            scanf("%lld",&val[i]);
        for(int i=1; i<n; i++)
            {
                scanf("%d%d",&u,&v);
                addEdg(u,v);
            }
        int ans=INF,falg[N],flag[N];
        for(int st=0; st<(1<<n); st++){
            int num=0;
            for(int i=1; i<=n; i++){
                fath[i]=i,mapt[i].clear();
                flag[i]=0;
                if(st&(1<<(i-1)))
                    num++,flag[i]=1;
            }
            if(ans<=num)continue;

            memset(vist,0,sizeof(vist));
            memset(f,0,sizeof(f));
            for(int i=1; (1<<(i-1))<=st; i++)
            if(st&(1<<(i-1)))
            for(int j=1; (1<<(j-1))<=st; j++)
                if(i!=j)
             if(st&(1<<(j-1)))
             mapt[i].push_back(j);
            dfs(1);
            memset(hase,0,sizeof(hase));
            for(int i=1; i<=n; i++)
                for(int j=1;j<=n; j++)
                hase[f[i][j]]++;
            int k=1;
            while(k<=n){
                if(val[k]>hase[k])break;
                k++;
            }
            if(k>n&&ans>num){
                    ans=num;
                for(int i=1; i<=n; i++)
                    falg[i]=flag[i];
            }
        }
        if(ans==INF){
            printf("-1\n",ans); continue;
        }
        printf("%d\n",ans);
        if(ans)
        {
            int ti=1;
            while(falg[ti]==0)ti++;
            printf("%d",ti);
            ti++;
            while(ti<=n)
            {
                if(falg[ti])printf(" %d",ti);
                ti++;
            }
            printf("\n");
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

计算客 自建物流的wu人机实验(简单)(状态压缩+LCA)

标签:图论   算法   压缩   

原文地址:http://blog.csdn.net/u010372095/article/details/46953399

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!