3149: [Ctsc2013]复原

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 95  Solved: 44
[Submit][Status][Discuss]

Description

在几何课上,老师画了一个圆,圆上有很多条弦,这些弦两两不重合,但是 有些是相交的。你本想把图临摹下来回家好好研究,可惜下课后,图被值日生 擦掉了。幸运的是,你准确地记录了弦的数量和弦的相交情况。
现在,你想尽量复原这张图。同时你还想知道,最多能选出多少条弦,使得 选出来的弦两两不相交。

Input

第一行包含2个正整数n,m,分别表示弦的条数以及相交弦的对数,所有的弦从1至n编号。接下来 m行每行两个正整数a,b,表示第a条弦与第b条弦相交。

Output

输出分为两行。
第一行输出2n个正整数,按逆时针方向给出满足题意的圆上每条弦的两个
端点的相对顺序,其中第i条弦的两个端点均用数字i来表示。
第二行输出1个正整数,表示最多能选多少条两两不相交的弦。

Sample Input

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

Sample Output

1 2 3 1 4 2 5 4 3 5
2

HINT

1<=N<=20 1<=M<=40

Source

[

//表示只会10分暴力
//对大神的位运算优化膜拜。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=;
const int M=1.5e6+;
int n,m,len,cnt,bin[N],lg[M],f[M],q[N],mp[N],pth[N<<],ans[N<<];
bool a[N][N],vis[N];int sum,end;
inline void Max(int &x,int y){if(x<y) x=y;}
bool dfs(int k,int goal){
if(k>goal) return ;
len++;
for(int i=len;i;i--) pth[i]=pth[i-];
for(int i=;i<=len;i++){
pth[i]=k;len++;
for(int j=len;j>i+;j--) pth[j]=pth[j-];
for(int j=i+,s=;j<=len;j++){
pth[j]=k;
if(!(s^mp[k]) && dfs(k+,goal)) return ;
pth[j]=pth[j+];
s^=bin[pth[j]-];
}
len--;pth[i]=pth[i+];
}
len--;
return ;
}
int bfs(int S){
int h=,t=;len=;q[t]=S;vis[S]=;
while(h!=t){
int x=q[++h];
for(int i=;i<=n;i++){
if(!vis[i] && a[x][i]){
vis[i]=;
q[++t]=i;
}
}
}
for(int j=;j<=t;j++){
mp[j]=;
for(int k=;k<j;k++){
if(a[q[j]][q[k]]) mp[j]|=bin[k-];
}
}
return t;
}
void work(){
for(int i=;i<=len;i++) ans[++cnt]=q[pth[i]];
for(int i=;i<=end;i++){
mp[i]=bin[i-];
for(int j=;j<=end;j++){
if(a[q[i]][q[j]]){
mp[i]|=bin[j-];
}
}
}
int mx=,tot=bin[end]-;
memset(f,,sizeof f);
for(int j=tot,x;j;j--){
mx=max(mx,f[j]);
for(int k=j;k;k^=x){
x=k&-k;
Max(f[j&(tot^mp[lg[x]+])],f[j]+);
}
}
sum+=max(mx,f[]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++) scanf("%d%d",&x,&y),a[x][y]=a[y][x]=;
for(int i=;i<=n;i++) bin[i]=<<i;
for(int i=;i<=bin[n];i++) lg[i]=lg[i>>]+;
for(int i=;i<=n;i++) if(!vis[i]){
end=bfs(i);
dfs(,end);
work();
}
for(int i=;i<=cnt;i++) printf("%d%c",ans[i],(i<cnt)?' ':'\n');
printf("%d\n",sum);
return ;
}

3149: [Ctsc2013]复原的更多相关文章

  1. BZOJ3149 CTSC2013 复原 搜索

    传送门 \(N \leq 20\)很适合暴搜-- 第二问最大独立集裸题,\(O(2^NN)\)的算法都能过-- 考虑第一问,使用搜索寻找可行解 每一次枚举一条弦的两个端点,通过位运算计算与其相交的弦的 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理

    最近比较忙有一段时间没有更新了,再接再厉继续分享. 案例下载:https://github.com/NewBLife/UWP/tree/master/SuspendSample 先我们看看App在生命 ...

  4. [LeetCode] Recover Binary Search Tree 复原二叉搜索树

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  5. [LeetCode] Restore IP Addresses 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  6. 程设大作业xjb写——魔方复原

    鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...

  7. 爱改名的小融 2(codevs 3149)

    3149 爱改名的小融 2  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Wikioi上有个人 ...

  8. AppDelegate关于应用程序挂起、复原与终止的代理方法

    AppDelegate关于应用程序挂起.复原与终止的代理方法: 首次运行: - (BOOL)application:(UIApplication *)application didFinishLaun ...

  9. 力扣算法题—093复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

随机推荐

  1. VMware网络连接失败

    假如你碰到了VMware 网络被断开, 明明已经分配了适配器, 客户端却显示网络断开没有连接. 可用恢复默认的方法重置所有网卡及服务. 进主工具首页.点击: 虚拟网络编辑器,然后点击下面的恢复默认. ...

  2. [LintCode]计算两个数的交集(二)

    问题分析: 用两个指针分别遍历即可. 问题求解: public class Solution { /** * @param nums1 an integer array * @param nums2 ...

  3. [oracle] 重要服务启动与停止命令行

    ① 控制台服务[em control] 启动:emctl start dbconsole 停止:emctl stop dbconsole ② 监听器服务[listener control] 启动:ls ...

  4. QSignalMapper类处理多信号关联同一个槽的方法(2)

    例1: QSignMapper *mapper = new QSignMapper(this) QPushButton *btn1 = new QPushButton(this); btn1-> ...

  5. debian下系列下的apt-get 命令与deb包的手动安装的dpkg命令

    手动下载的deb包的相关操作: 操作deb 使用dpkg 命令工具, dpkg 是Debian package的简写. 下面列举常用的 操作: dpkg –I name.deb  查看 包的详细信息( ...

  6. 美化VC界面(用户登录界面)

    源代码:下载 VC开发程序单调的界面相信大家都是深有感触,提到界面美化编程,人们都会说做界面不要用VC写,太难了.一句俗语:难者不会,会者不难.VC的美化界面编程并没有人们想像的那么难.这篇文章是我写 ...

  7. vs2013+MVC3.0+EasyUI的ComboBox联动使用(二)

     vs2013+MVC3.0+EasyUI的ComboBox联动使用(二) 简单介绍:在vs2013(.net4.0)中使用MVC3.0对于EasyUI中ComboBox的联动使用. 载入Comb ...

  8. par函数fg参数-控制前景色

    fg参数用来控制前景色,其实指的就是x轴和y轴的轴线和刻度线的颜色 在R语言中,会根据fg, col 任何一个参数的值,自动的将两个参数的值设置为相同的值,举个例子: par(fg = "r ...

  9. Uniprot 数据库-最常用的蛋白质数据库

    Uniprot 数据库是收录信息最全面的蛋白质数据库,包含swissport, uniparc, TrEMBL 3个子数据库: 其中swiss-prot 是手工核对过的 ,非冗余, 有详细注释信息的蛋 ...

  10. CentOS6.8安装mysql并设置字符集编码

    一.安装: 1. 首先以root用户进入系统 2. 输入命令: yum install mysql mysql-server -y 等待安装完成. 3. 启动MySQL,输入命令: /etc/init ...