题意:
一个完全图,某两点边权为这两点编号之按位与,求最小生成树,输出字典序最小的。
题解:
如果点数不为$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\n"); goto B; } k/=2; } printf("1\n"); 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("\n"); } return 0; }
原文地址:https://www.cnblogs.com/isakovsky/p/11279816.html
时间: 2024-10-09 15:12:23