hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到

题意:

一个完全图,某两点边权为这两点编号之按位与,求最小生成树,输出字典序最小的。

题解:

如果点数不为$2^n-1$,则每一点均可找到一点,两点之间边权为0,只需找到该点二进制下其最左边的0是第几位,与此位为1,其他位都为0的点相连,此边边权为0。

否则,第$2^n-1$点以此法找到的最小点是$2^n$,此点不存在,则$2^n-1$只能与1相连,得到边权为1。其他边都是0,总共得生成树边权和为1。

#include<iostream>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
//        int ans=0;
        int k=n+1;
        
        while(k>1){
            if(k%2){
                printf("0
");
                goto B;
            }
            k/=2;
        }
        printf("1
");
        
        B:;
        for(int i=2;i<=n;i++){
//            printf("%d:",i);
            
            for(int j=1;j<=n;j<<=1){
                if( (i&j) ==0){
                    printf("%d",j);
                    goto A; 
                }
            }
            
            printf("1");
//            ans++;
A:;
            if(i<n)printf(" ");
            
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/isakovsky/p/11279816.html