zoukankan      html  css  js  c++  java
  • HDU 6614 AND Minimum Spanning

    Time limit 1000 ms

    Memory limit 131072 kB

    OS Windows

    中文题意

    给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1n,每条边的边权为它的两个端点的标号做按位与。现在要求这个图的最小生成树,输出这棵树以1为根时2n总共n-1个点的父亲节点的标号(为啥不是母亲)。要求在该树边权和最小的前提下,输出的数据字典序最小。

    解题思路

    以1为根,那就把1固定下来吧。

    对于所有偶数点,肯定要以1为父亲,因为首先边权为0,其次因为字典序最小的要求,1是它们可以连到的编号最小的父亲。

    对于所有奇数点,我们肯定希望它连接到父亲的边权是0,那么它和父亲的二进制位就不能有同时为1的地方。又因为字典序最小的要求,它能连接到的边权为0、标号最小的父亲是哪位呢?我们想到了lowbit,我们可以将该奇数点编号取反,然后强行将最高位符号位置0,再求lowbit,就得到了我们希望它连接的父亲。换句话说,一个奇数点x的父亲应该是

    lowbit(0x7fffffff&(~x))
    

    比如对于13号点,二进制为1101,它的父亲就应该是0010。还没完,假设总共有7个点,那么7号点的父亲是谁呢?按照上面的分析,应该是8号点,但是没有8号点,而且因为7的二进制是0111,无论连到其他哪个点上边权都不为0,所以要让权值最小,我们只能把这种理论父亲不存在的点连接到1号点。

    源代码

    #include<stdio.h>
    
    int T;
    int n;
    long long sum;
    int fa[200010];
    inline int lowbit(int x){return x&-x;}
    int main()
    {
    	scanf("%d",&T);
    	while(T--)
    	{
    		sum=0;
    		scanf("%d",&n);
    		for(int i=2;i<=n;i+=2) fa[i]=1;
    		for(int i=3;i<=n;i+=2)
    		{
    			if(lowbit(i)==i) continue;
    			int lowzero=lowbit((~i)&0x7fffffff);//求理论父亲
    			if(lowzero>n) sum++,fa[i]=1;//理论父亲不存在
    			else fa[i]=lowzero;
    		}
    		printf("%d
    %d",sum,fa[2]);//这题卡PE艹
    		for(int i=3;i<=n;i++)
    			printf(" %d",fa[i]);
    		puts("");
    	}
    	return 0;
    }
    
  • 相关阅读:
    ubuntu下php-fpm多实例运行配置
    ubuntu下nginx+PHP-FPM安装配置
    php中include_path配置
    laravel中的队列
    laravel权限控制Gate
    Configuring an NVIDIA Jetson TX2
    NVIDIA Jetson TX2 の設定
    3-Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す(GPU編)
    2-Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す
    1-Jetson Nano Developer KitでAWS IoT Greengrassを動かしてみる
  • 原文地址:https://www.cnblogs.com/wawcac-blog/p/11289039.html
Copyright © 2011-2022 走看看