caioj1230: [图论补充]哈密顿路径
保存模版
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- int n,m,st,ed;
- int len,a[];
- bool v[],mp[][];
- void reverse(int l,int r)
- {
- while(l<r)
- {
- swap(a[l],a[r]);
- l++;r--;
- }
- }
- void expand()
- {
- while()
- {
- bool bk=false;
- for(int i=;i<=n;i++)
- {
- if(v[i]==false&&mp[ed][i]==true)
- {
- v[i]=true;a[++len]=i;ed=i;
- bk=true;break;
- }
- }
- if(bk==false)break;
- }
- }
- void hamilton()
- {
- st=;
- for(int i=;i<=n;i++)
- if(mp[st][i]==true){ed=i;break;}
- v[st]=true;a[++len]=st;
- v[ed]=true;a[++len]=ed;
- while()
- {
- expand();
- reverse(,len);swap(st,ed);
- expand();
- //若st,ed不相连,处理成相连
- if(mp[st][ed]==false)
- {
- //在a[2]到a[len-1]中寻找两个相邻的且与st、ed同时相连的点(必存在)
- for(int i=;i<len-;i++)
- {
- if(mp[st][a[i+]]==true&&mp[ed][a[i]]==true)
- {
- reverse(i+,len);//倒置a[i+1]到a[len]
- ed=a[len];break;
- }
- }
- }
- if(len==n)return ;
- //若a元素不满n个,未被遍历过的点在a[]中寻找与其相连的点
- for(int y=;y<=n;y++)
- {
- if(v[y]==false)
- {
- bool bk=false;
- for(int i=;i<len;i++)
- {
- if(mp[a[i]][y]==true)//相当于把a[i]~a[i+1]之间的连接断开,然后把a[i]和y连起来
- {
- st=a[i+];ed=y;
- reverse(,i);reverse(i+,len);
- v[y]=true;a[++len]=y;
- bk=true;break;
- }
- }
- if(bk==true)break;
- }
- }
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- int x,y;
- memset(mp,false,sizeof(mp));
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&x,&y);
- mp[x][y]=true;mp[y][x]=true;
- }
- len=;memset(a,,sizeof(a));
- memset(v,false,sizeof(v));
- hamilton();
- for(int i=;i<len;i++)printf("%d ",a[i]);
- printf("%d\n",a[len]);
- return ;
- }
caioj1230: [图论补充]哈密顿路径的更多相关文章
- 【Codeforces】【图论】【数量】【哈密顿路径】Fake bullions (CodeForces - 804F)
题意 有n个黑帮(gang),每个黑帮有siz[i]个人,黑帮与黑帮之间有有向边,并形成了一个竞赛完全图(即去除方向后正好为一个无向完全图).在很多年前,有一些人参与了一次大型抢劫,参与抢劫的人都获得 ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- 图论4——探索网络流的足迹:Dinic算法
1. 网络流:定义与简析 1.1 网络流是什么? 网络流是一种"类比水流的解决问题方法,与线性规划密切相关"(语出百度百科). 其实,在信息学竞赛中,简单的网络流并不需要太高深的数 ...
- 数据结构&图论:K短路-可持久化可并堆
本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 对于图G,建立一个以终点t为起点的最短路径构成的最短路径树 (就是反着跑一遍最短路,然后对于一个不为 ...
- [OI笔记]基础图论/图算法
[2017.8.29 00:00]--前几天开始好好学了几天的图论,不过这最近又突然因为一些原因(其实是晚上没睡好导致白天没精神)颓废了几天-一方面为了控制自己同时也可以当做之后noip前复习用的笔记 ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- ACM - 图论 - P3385 负环
P3385 负环 题目描述 给定一个 \(n\) 个点的有向图,请求出图中是否存在从顶点 \(1\) 出发能到达的负环. 负环的定义是:一条边权之和为负数的回路. 输入格式 本题单测试点有多组测试数据 ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)
在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
随机推荐
- 实验:iscsi共享存储
实验名称: iscsi共享存储 实验环境: 我们需要准备一个磁盘,对于这个磁盘我们需要使用,将这个磁盘空间共享给iscsi客户端: 实验需求: 我们这里使用两台服务器来实现iscsi共享存储: 1.指 ...
- linux find的用法
①.一般格式: ·find path -option [ -print ] [ -exec -ok command ] {} \; 说明: #-print 将查找到的文 ...
- Centos7 中Nginx的安装与配置
安装与配置 1.安装nginx yum intsall nginxsudo systemctl start nginx 启动服务sudo firewall-cmd --permanent --zone ...
- CactiI表结构和数据被动获取
cacti我们也用了很久了,但是它的表结构一直都没有去关心过,得空抽了半个晚上的时间,把它的库表结构大概看了下,某些字段的含义跟大家分享下:cacti的数据都是存放在rrdtool中的,数据库存放的其 ...
- Codeforces Round #386 (Div. 2) A+B+C+D!
A. Compote 水题(数据范围小都是水题),按照比例找最小的就行了,3min水过. int main() { int a,b,c; while(~scanf("%d%d%d" ...
- C. The Smallest String Concatenation-C++sort排序~~
C. The Smallest String Concatenation time limit per test 3 seconds memory limit per test 256 megabyt ...
- [luoguP2948] [USACO09OPEN]滑雪课Ski Lessons(DP)
传送门 f[i][j]表示i时刻能力值为j的最大滑雪数 显然f[0][1]=0,开始搜索 三种转移: ①美美的喝上一杯**:f[i+1][j]=max(f[i+1][j],f[i][j]) ②滑雪,f ...
- [luoguP1947] 笨笨当粉刷匠_NOI导刊2011提高(10)(DP)
传送门 f[i][j][k]表示前i行,最后一行前j个,选k次最优解 ntr[i][j][2]表示当前行区间i~j涂0或1所能刷的正确格子 #include <cstdio> #defin ...
- [POJ2352] Stars(树状数组)
传送门 先按照下标x排序,然后依次把y加入树状数组,边加入边统计即可. 注意下标re从零开始,需+1s ——代码 # include <iostream> # include <cs ...
- BZOJ2196: [Usaco2011 Mar]Brownie Slicing
n<=500 * m<=500的方阵,先沿横坐标切A-1刀,再把每一块切B-1刀,得到A*B块,求这A*B块的数字之和的最小值的最大值. 最小值最大--二分,然后贪心切.每次扫一行,看这一 ...