当前位置: 首页 > news >正文

SGU 122 The book(构造)

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=122

题意:构造哈密顿圈。

思路:对于任意两个点u和v的度之和大于等于n-1,则必存在哈密顿圈。构造的方法每本离散数学书上都有。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool a[1005][1005];
int visit[1005],ans[1005],n,m,num;

void reverse(int a,int b)
{
	while(a<b)
	{
		swap(ans[a],ans[b]);
		a++;
		b--;
	}
}


void deal()
{
    int i,j,mid,flag;
    num=0;
	ans[num++]=1;
	memset(visit,0,sizeof(visit));
	visit[1]=1;
	while(1)
	{
		while(1)
		{
			flag=0;
			for(i=1;i<=n&&!flag;i++) if(!visit[i]&&a[ans[num-1]][i])
				ans[num++]=i,flag=1,visit[i]=1;
			if(!flag) break;
		}
		reverse(0,num-1);
		while(1)
		{
			flag=0;
			for(i=1;i<=n&&!flag;i++) if(!visit[i]&&a[ans[num-1]][i])
				ans[num++]=i,flag=1,visit[i]=1;
			if(!flag) break;
		}
		mid=0;
		if(!a[ans[0]][ans[num-1]])
		{
			for(i=1;i<=num-2;i++) if(a[ans[i]][ans[num-1]]&&a[ans[0]][ans[i+1]])
			{
			    reverse(i+1,num-1);
				break;
			}
		}
		if(num==n) break;
		for(i=1;i<=n;i++) if(!visit[i])
		{
			for(j=1;j<=num-2;j++) if(a[i][ans[j]])
			{
		        reverse(0,j-1);
		        reverse(j,num-1);
		        ans[num++]=i;
		        visit[i]=1;
				break;
			}
			if(j<num-1) break;
		}
	}
}

void print()
{
    int i,j;
    for(i=0;i<num;i++) if(ans[i]==1) break;
    for(j=0;j<num;j++)
    {
        printf("%d ",ans[i++]);
        if(i==n) i=0;
    }
    puts("1");
}

int main()
{
	while(scanf("%d",&n)!=-1)
	{
		memset(a,0,sizeof(a));
		int i,k;
		for(i=1;i<=n;i++)
		{
			while(1)
			{
			    scanf("%d",&k);
			    a[i][k]=1;
			    k=getchar();
			    if(k=='\n'||k=='\r'||k==EOF) break;
			}
		}
		deal();
		print();
	}
	return 0;
}

  

相关文章:

  • 全局dialog,在小米4及部分机型上不能正常弹出
  • DOM常用操作
  • docker学习笔记7:发布镜像到docker hub上
  • Java通过wait()和notifyAll()方法实现线程间的通信
  • Ado.NET SQLHelper
  • ubuntu14.04 忘记root密码
  • 神奇语言python文件操作
  • Microsoft SQL Server登陆Linux
  • VSCode Python开发环境配置
  • 企业是怎么给MYSQL赋予用户权限
  • mongoDB 删除集合后,空间不释放
  • mysql分页(ajax)
  • BZOJ 1565 植物大战僵尸(最大权闭合图)
  • UVa 1586 - Molar mass
  • 072:【Django数据库】ORM聚合函数详解-aggregate和annotate
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android优雅地处理按钮重复点击
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue学习系列(二)vue-cli
  • vue中实现单选
  • 动态规划入门(以爬楼梯为例)
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端相关框架总和
  • 学习Vue.js的五个小例子
  • 延迟脚本的方式
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 正则与JS中的正则
  • mysql面试题分组并合并列
  • 国内开源镜像站点
  • ​ssh免密码登录设置及问题总结
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)fread与fwrite详解
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第61天)多租户架构(CDB/PDB)
  • (六)激光线扫描-三维重建
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (推荐)叮当——中文语音对话机器人
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Google的Objective-C编码规范
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [1127]图形打印 sdutOJ
  • [2016.7 day.5] T2
  • [Angular] 笔记 21:@ViewChild