LightOJ1086 Jogging Trails(欧拉回路+中国邮递员问题+SPFA)
题目求从某点出发回到该点经过所有边至少一次的最短行程。
- 这个问题我在《图论算法理论、实现及应用》中看过,是一个经典的问题——中国邮递员问题(CPP, chinese postman problem)也称为中国邮路问题,是我国数学家管梅谷教授于1962年首次提出的,引起了世界不少数学家的关注。例如1973年匈牙利数学家Edmonds和Johnsom对中国邮路问题提出了一种有效算法。
- 解决的方法就是通过添加边,使其成为欧拉回路。
而这一题的问题就可以转化给这个无向图加最短的边使其所有点的度位偶数(为什么不说欧拉回路,因为题目没说图一定连通。。
这道题在LightOJ分类是DP。。我想大概就是15个点二进制压缩的状压DP。也就是把各点度为偶数奇数分别看作二进制各位0和1,然后每次可以通过在任意两个奇度或偶度点加一条边来转移。。
不过显然这是不行的,这样的状态不满足DP的无后效性,状态是点转移是边那就可以是个有向有环图——有向有环图——于是我就想到最短路,显然可以用最短路做,不过时间复杂度不好说。。具体来说:
- 偶度点记0奇度记1压缩成的二进制就是要求最短路的图中的顶点,这样顶点最多215个;
- 而如果两个顶点有且仅有i和j这两位的二进制不同且原图中i到j有路径,那么这两个顶点间有一条边且权为原图中i到j中最短的那条路径;
- 最短路的起点就是原图度序列压缩表示的顶点,终点就是0。
如此构图,跑个SPFA,然后就AC了。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF (1<<30)
int n,map[][];
int d[<<];
bool vis[<<];
int SPFA(int vs){
for(int i=; i<(<<); ++i){
d[i]=INF; vis[i]=;
}
d[vs]=; vis[vs]=;
queue<int> que;
que.push(vs);
while(!que.empty()){
int u=que.front(); que.pop();
for(int i=; i<n; ++i){
for(int j=i+; j<n; ++j){
if(map[i][j]==-) continue;
int v=u; v^=(<<i); v^=(<<j);
if(d[v]>d[u]+map[i][j]){
d[v]=d[u]+map[i][j];
if(!vis[v]){
vis[v]=;
que.push(v);
}
}
}
}
vis[u]=;
}
return d[];
}
int main(){
int t,m,a,b,c;
scanf("%d",&t);
for(int cse=; cse<=t; ++cse){
scanf("%d%d",&n,&m);
memset(map,-,sizeof(map));
int deg[]={},res=;
while(m--){
scanf("%d%d%d",&a,&b,&c);
--a; --b;
++deg[a]; ++deg[b]; res+=c;
if(map[a][b]==- || map[a][b]>c) map[a][b]=map[b][a]=c;
}
int vs=;
for(int i=; i<n; ++i){
if(deg[i]&) vs|=(<<i);
}
res+=SPFA(vs);
printf("Case %d: %d\n",cse,res);
}
return ;
}
LightOJ1086 Jogging Trails(欧拉回路+中国邮递员问题+SPFA)的更多相关文章
- [POJ2404]Jogging Trails
我太弱了. 我们可以知道一个结论就是对于一个图的话假如所有点的度数都是偶数,那么只需要走一波欧拉回路. 所以我们就把奇点补成偶点. 将两个奇点补充到偶点的最佳方法是选择任意两个奇点连最短路径为权的边 ...
- POJ 2404 Jogging Trails
Jogging Trails Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2122 Accepted: 849 Des ...
- [UVa10296]Jogging Trails
题目大意: 中国邮递员问题. 给你一个无向带权连通图,求经过所有边并返回起点的最短路径. 思路: Edmonds-Johnson算法. 显然,当原图为欧拉图时,答案即为其欧拉回路的长度. 考虑原图不存 ...
- [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)
题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...
- POJ 2404 Jogging Trails [DP 状压 一般图最小权完美匹配]
传送门 题意:找一个经过所有边权值最小的回路,$n \le 15$ 所有点度数为偶则存在欧拉回路,直接输出权值和 否则考虑度数为奇的点,连着奇数条边,奇点之间走已经走过的路移动再走没走过的路 然后大体 ...
- POJ 2404 Jogging Trails(最小权完美匹配)
[题目链接] http://poj.org/problem?id=2404 [题目大意] 给出一张图,求走遍所有的路径至少一次,并且回到出发点所需要走的最短路程 [题解] 如果图中所有点为偶点,那么一 ...
- lightoj 1086 - Jogging Trails(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
随机推荐
- 淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播特效制作 (二)
1.我们来设计flash_slide.xml 布局,这个xml主要做成模块化,方便其它的activity可以动态去调用. flash_slide.xml内容如下: <?xml version=& ...
- Poj 1061 青蛙的约会(扩展GCD)
题目链接:http://poj.org/problem?id=1061 解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分 ...
- U盘安装Linux安装报错及解决方案
导读 从网上看到了<Linux就该这么学>后,偏离软件行业多年的我下定决心回归!这篇文章是我这一个小白的亲身经历,希望能被采纳! 开始按照<Linux就该这么学>中所讲在自己的 ...
- Python机器学习库scikit-learn实践
原文:http://blog.csdn.net/zouxy09/article/details/48903179 一.概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得 ...
- [ruby on rails] 跟我学之(8)修改数据
修改views 修改index视图(app/views/posts/index.html.erb),添加编辑链接,如下: <h1>Our blogs</h1> <% @p ...
- CSS3.0盒模型display:-webkit-box;的使用
box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典 的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没 ...
- VMware的四种网络连接方式
mkdir /mn/cdrom mount /dev/cdrom /mnt/cdrom Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类 ...
- 【Python】Django Model 怎么使用 UUID 作为主键?
>>> import uuidprint uuid.uuid3(uuid.uuid1(), 'python.org') >>> # make a UUID base ...
- process vs thread
process vs thread http://blog.csdn.net/mishifangxiangdefeng/article/details/7588727 6.进程与线程的区别:系统调度是 ...
- ACdream 1188 Read Phone Number (字符串大模拟)
Read Phone Number Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Sub ...