Tree Constructer

TreeConstructer

https://ac.nowcoder.com/acm/problem/216183

正常人谁打正解啊
瞎搞了一个小时终于过了~~~~
由于是随机算法,不保证在规定时间内一定可以跑出答案(但是实测还是很快的)
图片说明


建出的图一定是一个树
我们随便固定一个点为跟节点
先求一遍dfs序
然后就开始我们的随机算法
dfs跑树,随机赋值跑到的点的点权,保证和其父亲的或为m(m为1<<60 -1)
利用刚刚求出的dfs序,我们可以知道我们已经确定了哪些点,判断与他们的或不等于m
如果找不到点权匹配,返回0
如果接受递归返回0,以一定概率重新分配此点点权(我用的goto实现),以一定概率回溯到上一级

/*
随机搜索
固定一个点为根节点
跑树,保证相邻的点或为m
随机点权,以一定概率进行回溯 
*/ 
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int m=(1ll<<60)-1;
struct oppo{
    int to,nex;
}rod[10005];
int head[105],tot;
void add(int from,int to)
{
    rod[++tot].to=to;
    rod[tot].nex=head[from];
    head[from]=tot;
}
int rand_m()
{
    int ans=0;
    for(int i=0;i<=59;i++)
        ans+= (1ll*(rand()&1))<<i;
    return ans;
}
int val[105]; 
int ds[105],tt;
void ddd(int x,int fa)//求dfs序 
{
    ds[++tt]=x;
    for(int i=head[x];i;i=rod[i].nex){
        int to=rod[i].to;
        if(to==fa) continue;
        ddd(to,x);
    }
}
bool dfs(int x,int fa,int k)
{
    //随机自身点权 
    begin://重新开始标记 
    int tot=0;
    while(1){
        val[x]=(k^m)|rand_m();
        bool flag=0;
        for(int i=1;i<=n&&ds[i]!=x&&!flag;i++)
            if(ds[i]!=fa&&(val[ds[i]]|val[x])==m){
                flag=1;
            }
        if(!flag) break;
        if(++tot>100) return 0;//找不到可行值 
    }
    int all=0;
    //遍历子树 
    for(int i=head[x];i;i=rod[i].nex){
        int to=rod[i].to;
        if(to==fa) continue;
        if(!dfs(to,x,val[x])){
            if(rand()%5) goto begin;//重新开始分配此节点 
            else{
                val[x]=-1;
                return 0;
            }//向上返回 
        }
    }
    return 1;
}
signed main()
{
    srand(time(0));
    memset(val,-1,sizeof(val));
    cin>>n;
    for(int i=1;i<n;i++){
        int s,t;
        cin>>s>>t;
        add(s,t);
        add(t,s);
    }
    ddd(1,0);
    while(dfs(1,0,m)==0);
    for(int i=1;i<=n;i++)
        cout<<val[i]<<" ";
    return 0;
}
全部评论

相关推荐

繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务