题目求从某点出发回到该点经过所有边至少一次的最短行程。

  • 这个问题我在《图论算法理论、实现及应用》中看过,是一个经典的问题——中国邮递员问题(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)的更多相关文章

  1. [POJ2404]Jogging Trails

    我太弱了. 我们可以知道一个结论就是对于一个图的话假如所有点的度数都是偶数,那么只需要走一波欧拉回路. 所以我们就把奇点补成偶点. 将两个奇点补充到偶点的最佳方法是选择任意两个奇点连最短路径为权的边 ...

  2. POJ 2404 Jogging Trails

    Jogging Trails Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2122   Accepted: 849 Des ...

  3. [UVa10296]Jogging Trails

    题目大意: 中国邮递员问题. 给你一个无向带权连通图,求经过所有边并返回起点的最短路径. 思路: Edmonds-Johnson算法. 显然,当原图为欧拉图时,答案即为其欧拉回路的长度. 考虑原图不存 ...

  4. [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)

    题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...

  5. POJ 2404 Jogging Trails [DP 状压 一般图最小权完美匹配]

    传送门 题意:找一个经过所有边权值最小的回路,$n \le 15$ 所有点度数为偶则存在欧拉回路,直接输出权值和 否则考虑度数为奇的点,连着奇数条边,奇点之间走已经走过的路移动再走没走过的路 然后大体 ...

  6. POJ 2404 Jogging Trails(最小权完美匹配)

    [题目链接] http://poj.org/problem?id=2404 [题目大意] 给出一张图,求走遍所有的路径至少一次,并且回到出发点所需要走的最短路程 [题解] 如果图中所有点为偶点,那么一 ...

  7. lightoj 1086 - Jogging Trails(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...

  8. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  9. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

随机推荐

  1. ios开发者到真机测试

    ios就是矫情, 没事搞那么多步奏, 搞得我都不会弄了, 不懈努力后还是弄好了, 总结一下, 避免新人走弯路. 苹果的脾气就是这样, 只能慢慢学了 1.  生成CSR (开发者证书认证请求) 打开钥匙 ...

  2. Linux tcp_wrappers 详解

    tcp_wrappers是linux中一个安全机制[TCP_wrappers防火墙],一定程度上限制某种服务的访问权限,达到了保护系统的目的一. 要想用好tcp_wrappers,首先检查某种服务是否 ...

  3. error splicing file: file too large解决方法

    FAT32格式的usb最大支持4G的文件,拷贝超过4G的文件需要把usb换成NTFS格式.

  4. 在SharePoint 2010 母版页里添加自定义用户控件

    在SharePoint 2010 母版页里添加自定义用户控件(译) 使用自定义用户控件的好处: 1.容易部署:2.易于控制显示或隐藏. (在使用的过程中)可能要面对的问题是:如何在用户控件里使用Sha ...

  5. Python egg

    http://blog.csdn.net/turkeyzhou/article/details/8876658

  6. iOS block 声明时和定义时的不同格式

    今天写程序时,在实现一个block时总提示格式错误,对比api的block参数格式,没发现错误.后来查阅了资料,发现这两个格式是不同的! 具体格式见下方 NSString * (^testBlock) ...

  7. CI框架初探

    2014年7月3日 17:39:35 简易版: index.php->codeIgniter.php->找到控制器类文件并include->创建实例->执行成员函数 详细版本: ...

  8. ubuntu 13.10 amd64安装ia32-libs

    很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软件或包apt-get install program:i386.有的还 ...

  9. Android之Fragment(一)

    Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板 ...

  10. android wifi驱动移植详细过程

    转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...