传送门

题目大意

给你一张图,求这张图的汉密尔顿回路。

分析

因为m≤n+20,所以如果存在回路一定是在一个环中加入了至多20条边。我们先考虑dfs,但我们发现如果出现图1这种情况就会是复杂度爆炸

图1图2

我们发现如果有很多这样的三角形程序就会爆炸。所以我们考虑优化。我们发现对于所有出度为1的点我们完全不必枚举它的出边,所以根据这些就写出了代码1,然后它居然能水过,但是对于像图2这种数据它就只有被卡掉的份啦,所以我们考虑继续优化。我们考虑将所有只有一条路径的点从图中真实的去掉,也就是说我们将所有点的相连关系提前记录下来,以便后续输出答案,而在搜索过程中只考虑出度不为1的点,听起来可能有些麻烦,参照代码2看看写写就好理解了。

代码1

#include<bits/stdc++.h>
using namespace std;
vector<int>v[];
int n,m,x[],y[],vis[],id[],od[],nxt[];
int ans[];
inline void bad(){
puts("There is no route, Karl!");
exit();
}
inline void dfs(int x){
if(vis[x])return;
vis[x]=;
for(int i=;i<v[x].size();i++)dfs(v[x][i]);
}
inline void pr(){
for(int i=;i<=n;i++)
printf(" %d",ans[i]);
puts("");
exit();
}
inline void search(int x,int cnt){
if(cnt==n){
ans[cnt]=x;
if(x==)pr();
return;
}
if(vis[x])return;
ans[cnt]=x;
vis[x]=;
if(nxt[x]){
search(nxt[x],cnt+);
}else {
for(int i=;i<v[x].size();i++){
search(v[x][i],cnt+);
}
}
vis[x]=;
return;
}
int main(){
freopen("king.in","r",stdin);
freopen("king.out","w",stdout);
scanf("%d%d",&n,&m);
if(m<n)bad();
for(int i=;i<=m;++i){
scanf("%d%d",&x[i],&y[i]);
v[x[i]].push_back(y[i]);
}
memset(vis,,sizeof(vis));
dfs();
for(int i=;i<=n;i++)
if(!vis[i])
bad();
for(int i=;i<=n;i++)v[i].clear();
for(int i=;i<=m;i++){
v[y[i]].push_back(x[i]);
}
memset(vis,,sizeof(vis));
dfs();
for(int i=;i<=n;i++)
if(!vis[i])
bad();
for(int i=;i<=n;i++)v[i].clear();
for(int i=;i<=m;i++){
v[x[i]].push_back(y[i]);
if(od[x[i]]==)od[x[i]]=y[i];
else if(od[x[i]]!=y[i])od[x[i]]=-;
if(id[y[i]]==)id[y[i]]=x[i];
else if(id[y[i]]!=x[i])id[y[i]]=-;
}
for(int i=;i<=n;i++)
if(od[i]==||id[i]==)
bad();
for(int i=;i<=n;i++)
if(od[i]>&&id[i]>){
nxt[i]=od[i];
nxt[id[i]]=i;
}
memset(vis,,sizeof(vis));
search(,);
bad();
return ;
}

代码2

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl
vector<int>v[];
vector<int>cpx;
int nxt[],vis[],arr[],n,m;
inline void bad(){
puts("There is no route, Karl!");
exit();
}
inline void check(){
int i,x;
memset(arr,,sizeof(arr));
for(i=,x=;i<=n;i++,x=nxt[x]){
if(arr[x])return;
arr[x]=;
}
for(i=,x=;i<=n;i++,x=nxt[x]){
printf("%d ",x);
}
cout<<<<endl;
exit();
}
inline void work(int wh){
if(wh==cpx.size()){
check();
return;
}
int x=cpx[wh];
for(int i=;i<v[x].size();i++)
if(!vis[v[x][i]]){
nxt[x]=v[x][i];
vis[v[x][i]]=;
work(wh+);
vis[v[x][i]]=;
}
return;
}
int main(){
freopen("king.in","r",stdin);
freopen("king.out","w",stdout);
int i,j,k;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
}
for(i=;i<=n;i++)
if(v[i].empty())bad();
for(i=;i<=n;i++)
if(v[i].size()>){
cpx.push_back(i);
}else {
if(vis[v[i][]])bad();
vis[v[i][]]=;
}
for(i=;i<=n;i++)
nxt[i]=v[i][];
work();
bad();
return ;
}

100851K King’s Inspection的更多相关文章

  1. Codeforces Gym 100851 K King's Inspection ( 哈密顿回路 && 模拟 )

    题目链接 题意 : 给出 N 个点(最多 1e6 )和 M 条边 (最多 N + 20 条 )要你输出一条从 1 开始回到 1 的哈密顿回路路径,不存在则输出 " There is no r ...

  2. Gym 100851K

    Problem King's Inspection 题目大意 给一张n个点m条边的无向图,问是否存在一条欧拉回路. n<=10^5, 0<=m<=n+20. 解题分析 注意到数据范围 ...

  3. NEERC15

    2015-2016 ACM-ICPC Northeastern European Regional Contest 再开一个新坑吧 目前姿势有限,C.H.I仍然处于弃坑状态 代码戳这里 Problem ...

  4. Gym 100851 题解

    A: Adjustment Office 题意:在一个n*n的矩阵,每个格子的的价值为 (x+y), 现在有操作取一行的值,或者一列的值之后输出这个和, 并且把这些格子上的值归0. 题解:模拟, 分成 ...

  5. 2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19)

    2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19) easy: ABFGHI medium-ea ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. [bzoj1087][scoi2005]互不侵犯king

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...

  8. King's Quest —— POJ1904(ZOJ2470)Tarjan缩点

    King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...

  9. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

随机推荐

  1. Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

    数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当 ...

  2. Office 2007在安装过程中出错

    1, 可能是因为c:\program files\common files\microsoft Shared\web server Extensions\40\bin目录下缺少Fp4autl.dll, ...

  3. CodeForces - 156D:Clues(矩阵树定理&并查集)

    题意:给定N点,M边,求添加最少的边使之变为连通图的方案数. 思路:注意题目给出的M边可能带环,即最后生成的不一定是一棵树.但是影响不大.根据矩阵树定理,我们知道生成树的数量=N^(N-2),即点数^ ...

  4. 《Javascript高级程序设计》阅读记录(四):第五章 下

    这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅 ...

  5. ACM学习历程—2016"百度之星" - 资格赛(Astar Round1)

    http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 A题: 给定字符串,求任意区间的Hash值. 根据题目给定的Hash方式,属 ...

  6. WPF案例:如何设计历史记录查看UI

    (CSDN博客目前不支持外链, 只能纯文字) 设计WPF的UI,一般遵循下面的步骤: 1.首先分析数据结构 2.根据数据结构选择合理控件 3.定制外观 具体对于历史记录查看UI, 我们可以得知: 1. ...

  7. svn Can't revert without reverting children 解决方案

    EMZ3.0 qrh$ svn commit -m ""svn: E155010: Commit failed (details follow):svn: E155010: '/U ...

  8. I/O---读取txt文件----demo

    首先获得一个文件句柄.File file = new File(); file即为文件句柄. 读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了.接下 ...

  9. 开发环境入门 linux基础 (部分)nginx和nfs

    nginx和nfs 复习总结 rpm -ivh 软件包 --nodeps (没有依赖性安装) rpm -ivh 软件包 --force (覆盖安装) yum -y upgrade 升级所有包,不改变软 ...

  10. rsync mac->windows openssh

    rsync -azvP --progress -e "ssh -p 6666" /Users/codar/360\344\272\221\347\233\230/ghld/ rsy ...