[构造 哈密顿路径] SRM 704 div1 HamiltonianConstruction
来源:互联网 发布:淘宝店运营方案 编辑:程序博客网 时间:2024/04/30 09:34
构造一个图使得1到n的哈密尔顿路径恰好为k。
k<=100000, 要求点数不超过20。
广为流传的做法是
1<-2<-…<-18一条路径,然后1-18都向编号比它大的节点连边。这样的话往回走就只有唯一的路径,所以假如说我当前在i,走到了j,j>i,那么就需要立刻从j到j-1直到i+1,然后再往后走。这样就相当于每个节点有选或不选两种状态,如果选的话就是从前面第一个比它小的选的节点跳过来,不选的话就是从i+1过来。所以如果有0->i,就相当于贡献了
218−i−1 (1≤i<18)(因为18是必选的,19不能回到18)。
当然还有瞎搞的做法
传送门
dls的做法
// BEGIN CUT HERE #include<conio.h>#include<sstream>// END CUT HERE #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<string>#include<set>#define cl(x) memset(x,0,sizeof(x))using namespace std;typedef long long ll;class HamiltonianConstruction{public: vector <string> construct(int k){ int n=20; vector<string> ans(n,string(n,'N')); for (int i=2;i<=n-2;i++) ans[i][i-1]='Y'; for(int i=1;i<n;i++) for(int j=i+1;j<n;j++) ans[i][j]='Y'; for (int i=0;i<=17;i++,k>>=1) if (k&1) ans[0][18-i-1]='Y'; return ans; } // BEGIN CUT HEREpublic: void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }private: template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); } void verify_case(int Case, const vector <string> &Expected, const vector <string> &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: " << print_array(Expected) << endl; cerr << "\tReceived: " << print_array(Received) << endl; } } void test_case_0() { int Arg0 = 1; string Arr1[] = {"NY", "NN" }; vector <string> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(0, Arg1, construct(Arg0)); } void test_case_1() { int Arg0 = 3; string Arr1[] = {"NYYNY", "YNYYY", "YYNYY", "YNYNY", "YYYYN" }; vector <string> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(1, Arg1, construct(Arg0)); } void test_case_2() { int Arg0 = 720; string Arr1[] = {"NYYYYYYY", "YNYYYYYY", "YYNYYYYY", "YYYNYYYY", "YYYYNYYY", "YYYYYNYY", "YYYYYYNY", "YYYYYYYN" }; vector <string> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(2, Arg1, construct(Arg0)); } void test_case_3() { int Arg0 = 288; string Arr1[] = {"NYYYYNYY", "YNYYYYYY", "YYNYYYNY", "YYYNYYYY", "YNYYNYYY", "YYYYYNYN", "YYNYYYNY", "YYYYYNNN" }; vector <string> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(3, Arg1, construct(Arg0)); } // END CUT HERE};// BEGIN CUT HEREint main(){ HamiltonianConstruction ___test; ___test.run_test(-1); getch() ; return 0;}// END CUT HERE
0 0
- [构造 哈密顿路径] SRM 704 div1 HamiltonianConstruction
- 1776 Task Sequences 竞赛图构造哈密顿路径
- poj2438构造哈密顿图
- [构造] SRM 689 div1 MultiplicationTable3
- hdu 5424 哈密顿路径
- 汉密尔顿路径(哈密顿路径)解析
- 汉密尔顿路径(哈密顿路径)解析
- [构造 二分图] SRM 693 div1 BipartiteConstruction
- [贪心 构造] SRM 717 div1 ScoresSequence
- hdu3377plan【哈密顿路径插头Dp】
- hdu3538(最短哈密顿路径)
- TopCoder SRM 658 Div1 300 - OddEvenTree (树的性质 + 构造)
- HDU2181哈密顿绕行世界问题(DFS +路径输出)
- Poj 1428 Children's Dining【哈密顿路径】
- poj1776Task Sequences【竞赛图的哈密顿路径】
- 哈密顿绕行世界问题 (深搜(记录路径))
- [哈密顿路径 FFT 容斥] TCO 2016 Final HamiltonianPaths
- 最小哈密顿回路
- Servlet中的HttpServletRequest
- C++四种类型转换机制
- block块对象
- String类详解
- [kuangbin带你飞]专题一 简单搜索 F
- [构造 哈密顿路径] SRM 704 div1 HamiltonianConstruction
- EventBus
- 神经网络激活函数的介绍
- poj
- PAT 乙级1005
- 路由器逆向分析------在QEMU MIPS虚拟机上运行MIPS程序(ssh方式)
- Hololens中使用holotoolkit自带的按钮
- Java 多线程3:Lock 接口(接口方法分析,ReentrantLock,ReadWriteLock)
- 以太网芯片MAC和PHY