poj 2404 中国邮递员问题 欧拉回路判定+状压dp
- /*
- 状压dp
- 邮递员问题:求经过任意点出发经过每一条边一次并回到原点。
- 解法:1、如果是欧拉回路那么就是所有的边的总和。
- 2、一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状压dp。
- */
- #include<stdio.h>
- #include<string.h>
- #define N 20
- #define inf 1000000000
- int ma[N][N];
- int lower[N];
- int dp[1<<16];//注意这里数组要开够
- void floyd(int n) {
- int i,j,k;
- for(k=1;k<=n;k++)
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++) {
- if(ma[i][k]>=inf||ma[k][j]>=inf)continue;
- if(ma[i][j]>ma[i][k]+ma[k][j])
- ma[i][j]=ma[i][k]+ma[k][j];
- }
- return ;
- }
- int vis[N];
- int judge(int n) {
- int k=0,num=0;
- while(n) {
- vis[k]=n%2;
- if(vis[k])
- num++;
- n/=2;
- k++;
- }
- return num;
- }
- int main() {
- int n,m,i,j,k,sum,degree[N],f,to[N],low,last;
- lower[0]=1;
- for(i=1;i<=17;i++)//二进制
- lower[i]=lower[i-1]*2;
- while(scanf("%d",&n),n) {
- scanf("%d",&m);
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- ma[i][j]=(i==j)?0:inf;
- memset(degree,0,sizeof(degree));
- sum=0;
- while(m--) {
- scanf("%d%d%d",&i,&j,&k);
- if(ma[i][j]>k)
- ma[i][j]=ma[j][i]=k;
- degree[i]++;//求解度数
- degree[j]++;
- sum+=k;
- }
- f=0;
- for(i=1;i<=n;i++)
- if(degree[i]%2==1)
- to[f++]=i;
- if(f==0) {//判断是否是欧拉回路
- printf("%d\n",sum);
- continue;
- }
- floyd(n);//求解任意两点的距离实际用的只有奇度顶点
- // printf("z\n");
- low=1<<f;
- for(i=1;i<low;i++)//初始化
- dp[i]=inf;
- dp[0]=0;
- //printf("%d\n",f);
- for(i=1;i<low;i++) {
- memset(vis,0,sizeof(vis));
- if(judge(i)%2==1)continue;//如果是奇数不符合
- for(j=0;j<f;j++)
- for(k=0;k<f;k++) {
- if(j==k)continue;//不能相同
- if(!vis[j]||!vis[k])continue;//只要有一个没有就不符合
- last=i^lower[j]^lower[k];
- if(dp[i]>dp[last]+ma[to[j]][to[k]])//当前的状态=去掉j和k的状态+j和k的最短路
- dp[i]=dp[last]+ma[to[j]][to[k]];
- }
- }
- // printf("%d\n",dp[low-1]);
- printf("%d\n",sum+dp[low-1]);//奇度顶点的总的最小匹配为重复边+总的边数
- }
- return 0;
- }
poj 2404 中国邮递员问题 欧拉回路判定+状压dp的更多相关文章
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- POJ 1321 棋盘问题(DFS & 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- POJ:1185-炮兵阵地(状压dp入门)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组 ...
- 【POJ】1185 炮兵阵地(状压dp)
题目 传送门:QWQ 分析 看到$ M<=10 $考虑状压. 然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态. 然后枚举. 然后复杂度最坏是$ O(100 \times 1024 ...
- POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...
- POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接[http://poj.org/problem?id=2411] 题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方法? ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- POJ 2441 Arrange the Bulls(状压DP)
[题目链接] http://poj.org/problem?id=2441 [题目大意] 每个人有过个喜欢的篮球场地,但是一个场地只能给一个人, 问所有人都有自己喜欢的场地的方案数. [题解] 状态S ...
- POJ 2686 Traveling by Stagecoach(状压DP)
[题目链接] http://poj.org/problem?id=2686 [题目大意] 给出一张无向图,你有n张马车票每张车票可以租用ti匹马, 用一张马车票从一个城市到另一个城市所用的时间为这两个 ...
随机推荐
- bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】
算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...
- $CF19A\ World\ Football\ Cup$
炒鸡\(6\)批的模拟题. 注意的是输入 把握好空格 大小写. 根据题目的这句话来排序 积分榜是按照以下原则制作的:胜利一个队得3分,平分1分,失败0分. 首先,球队按积分顺序排在积分榜上,分数相等比 ...
- [C++ STL] map使用详解
一.set介绍: Map由红黑树实现,其元素都是"键值/实值"所形成的一个对组(key/value pairs).每个元素有一个键,是排序准则的基础.每一个键只能出现一次,不允许重 ...
- 记录一次mysql导入千万条测试数据过慢的问题!
数据库在没有做任何优化的情况下,使用存储过程,插入1千万条测试数据. CREATE PROCEDURE addmaxdata(IN n int) BEGIN DECLARE i INT DEFAULT ...
- exe4j将可执行的jar封装成exe文件
1,将java项目打包成可执行的jar:https://www.cnblogs.com/3b2414/p/9355292.html, 2,下载好exe4j工具, 3,首先注册,如果你不注册,打包好的软 ...
- Android通过微信实现第三方登录并使用OKHttp获得Token及源码下载
这里对于App在微信开放平台上申请AppID和secret在这里就略过了,我们微信的授权登录流程,腾讯官网给的流程如下: 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用 ...
- Android 知识Tips
有一些Android很小的知识点,不值得单独写出来做为一篇博客.都在这个博客里面进行总结 1.ImageButton控件,中间图片的放置效果可以用scaleType来设置,如下: <ImageB ...
- Linux 学习(三)
Linux进程 1.进程 进程:可执行应用程序执行后产生的对应的进程,重量级:进程是由一个线程或多个线程构成: 线程:是计算机中的最小单位,轻量级(依赖和物理性是独立存在的).损耗较低 假设进程1是由 ...
- MFC_2.3 定时器、滑块、进度条控件
定时器.滑块.进度条控件 1.拖控件 2.绑定变量.默认,然后取名字 3.初始化设置定时器 // 设置滑块和进度条的范围 m_TrackBar.SetRange(0, 1000); m_StaticP ...
- CAD向控件注册一个命令
_DMxDrawX::RegistUserCustomCommand 向控件注册一个命令,用户在命令行输入命令名这个字符串,就会触发执行命令事件 命令事件的id就是该注册时的id值,成功返回true. ...