汉密尔顿回路求解

2024-06-15 19:38
文章标签 求解 回路 汉密尔顿

本文主要是介绍汉密尔顿回路求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

汉密尔顿通路:给定图G,若存在一条经过图中的每个顶点一次且仅一次的通路,则称这条
通路为汉密尔顿通路。
汉密尔顿回路:若存在一条回路,经过图中的每个顶点一次且仅一次,则
称这条回路为汉密尔顿回路。
汉密尔顿图:具有汉密尔顿回路的图称为汉密尔顿图。


zoj 2398 poj 2288

地图中有许多岛屿 沿着桥访问每个岛屿一次且仅一次的路径

每个岛屿还有相应的权值  根据路径 会有相应的求值方式 

求出最大的权值和以及路径的数目


使用二进制位表示路径状态  用状态值记录 权值和路径数

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  13
#define INF 0x7fffffff
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll long long
#define MAXSTATUS 1<<13//状态最大数目using namespace std;ll dp[MAXSTATUS][MAXN][MAXN];
ll ways[MAXSTATUS][MAXN][MAXN];ll value[MAXN];
bool link[MAXN][MAXN];
int nislands;
ll maxvalue; //最好的三角汉密尔顿回路路径的权值
ll maxways;//最多路径数目void init()
{int nbridges;scanf("%d%d",&nislands,&nbridges);for(int i=0;i<nislands;i++)scanf("%lld",&value[i]);if(nislands==1)  return;MEM(dp,-1); MEM(ways,0); MEM(link,0);for(int i=0;i<nbridges;i++){int row,col;scanf("%d%d",&row,&col);row--; col--;link[row][col]=1; link[col][row]=1;dp[(1<<row)|(1<<col)][row][col]=value[row]+value[col]+value[row]*value[col];dp[(1<<row)|(1<<col)][col][row]=value[row]+value[col]+value[row]*value[col];ways[(1<<row)|(1<<col)][row][col]=1;ways[(1<<row)|(1<<col)][col][row]=1;}
}void solve()
{ll tmp;int nextstatus;if(nislands==1){maxvalue=value[0];maxways=1;return;}for(int s=0;s<(1<<nislands);s++){for(int i=0;i<nislands;i++){if(s&(1<<i)){for(int j=0;j<nislands;j++){if(i!=j&&(s&(1<<j))&&dp[s][i][j]>-1){for(int k=0;k<nislands;k++){if(!(s&(1<<k))&&link[i][k]==1){nextstatus=s|(1<<k);tmp=dp[s][i][j]+value[k]+value[i]*value[k];if(link[j][k]==1)tmp+=value[i]*value[j]*value[k];if(dp[nextstatus][k][i]==tmp)ways[nextstatus][k][i]+=ways[s][i][j];else if(dp[nextstatus][k][i]<tmp){dp[nextstatus][k][i]=tmp;ways[nextstatus][k][i]=ways[s][i][j];}}}}}}}}maxvalue=-1;maxways=0;int s=(1<<nislands)-1;for(int i=0;i<nislands;i++){for(int j=0;j<nislands;j++){if(!link[i][j])  continue;if(dp[s][i][j]==maxvalue)maxways+=ways[s][i][j];else if(dp[s][i][j]>maxvalue){maxways=ways[s][i][j];maxvalue=dp[s][i][j];}}}maxways/=2;
}int main()
{
//freopen("ceshi.txt","r",stdin);int tc;scanf("%d",&tc);while(tc--){init();solve();if(maxvalue==-1)printf("0 0\n");elseprintf("%lld %lld\n",maxvalue,maxways);}return 0;
}





   

这篇关于汉密尔顿回路求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064388

相关文章

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

nyoj42(并查集解决欧拉回路)

一笔画问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。   输入 第一行只有一个正整数N(N<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

JD 1027:欧拉回路

OJ题目:click here~~ 题目分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉路径的图称为欧拉图(简称E图)。 无向图存在欧拉回路的充要条件: 一个无向图存在欧拉回路,当且仅当该图拥有奇数度数的顶点的个数为0且该图是连通图。 有向图存在欧拉回路的充要条件: 一

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步

最值求解 | 管理类联考数学专项

日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】