zoj 3332 竞赛图哈密顿路
2015-11-23 23:36
204 查看
题意:给定一个有向竞赛图,求这个图的一个哈密顿路,如果不存在,输出Impossible。
思路:有向竞赛图必然存在HP的。证明:考虑极长路径p1,p2...pn;再考虑路径外一点x。如果有(x,p1),那么这条路加长了;否则必有(p1,x),那么如果有(x,p2),那么x可以加到p1,p2之间,路还是加长了;所以只能是(x,p2),如此这般,只能有(pn,x)路还是加长了。。。
做的时候只需要按上述思路,按顺序将点加进去就行了。复杂度是n^2的。
思路:有向竞赛图必然存在HP的。证明:考虑极长路径p1,p2...pn;再考虑路径外一点x。如果有(x,p1),那么这条路加长了;否则必有(p1,x),那么如果有(x,p2),那么x可以加到p1,p2之间,路还是加长了;所以只能是(x,p2),如此这般,只能有(pn,x)路还是加长了。。。
做的时候只需要按上述思路,按顺序将点加进去就行了。复杂度是n^2的。
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <cstdlib> #include <vector> using namespace std; #define clr(s,t) memset(s,t,sizeof(s)) #define N 105 int T,n,res ,g ; int main(){ scanf("%d",&T); while(T--){ int i,j,k,a,b; clr(g, 0); scanf("%d",&n); j = (n-1)*n/2; for(i = 1;i<=j;i++){ scanf("%d %d",&a,&b); g[a][b] = 1; } res[1] = 1; for(k = 2;k<=n;k++){ for(i = 1;i<k;i++)//找到k点应该插入到哪 if(g[k][res[i]]) break; for(j = k;j>i;j--) res[j] = res[j-1]; res[j] = k; } for(i = 1;i<n;i++) printf("%d ",res[i]); printf("%d\n",res ); } return 0; }
相关文章推荐
- Shader学习历程(四)——Unity官方Image effect__Fisheye
- web入门第七八天
- 备战CTF刷题(一)网络信息安全攻防学习平台——基础题
- 面试之C++面试题汇总3
- PAGE_FAULT_IN_NONPAGED_AREA解决
- c语言:有趣的转义字符用法
- springMVC中相关注解
- ThreadLocal原理及其实际应用
- 查看centos操作系统的版本的命令
- HDU 1069&&HDU 1087 (DP 最长序列之和)
- 数据库应用之关系代数(relational algebra)
- 【南大软院大神养成计划:第八天】Sublime Text信仰初养成(一)
- JS滑动门
- requirejs
- iOS警告框和操作表
- lua的closure创建和使用
- iOS开发多线程-多线程简单介绍
- 特征选择
- c语言:对于一个变量n,const用法和指针的比较
- 递归思想解决输出目录下的全部文件