洛谷 P2747 Canada Tour 周游加拿大 动态规划
Description
你赢得了一场航空公司举办的比赛,奖品是一张加拿大机票。旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城市。每个城市只能访问一次,除了旅行开始的城市之外,这个城市必定要被访问两次(在旅行的开始和结束)。你不允许使用其他公司的航线或者用其他的交通工具。
给出这个航空公司开放的城市的列表,和两两城市之间的直达航线列表。找出能够访问尽可能多的城市的路线,这条路线必须满足上述条件,也就是从列表中的第一个城市开始旅行,访问到列表中最后一个城市之后再返回第一个城市。
Input
Line 1: 航空公司开放的城市数 N 和将要列出的直达航线的数量 V。N 是一个不大于 100 的正整数。V 是任意的正整数。
Lines 2..N+1: 每行包括一个航空公司开放的城市名称。城市名称按照自西向东排列。不会出现两个城市在同一条经线上的情况。每个城市的名称都是一个字符串,最多15字节,由拉丁字母表上的字母组成;城市名称中没有空格。
Lines N+2...N+2+V-1:每行包括两个城市名称(由上面列表中的城市名称组成),用一个空格分开,这样就表示两个城市之间的直达双程航线。
Ouput
Line 1: 按照最佳路线访问的不同城市的数量 M。如果无法找到路线,输出 1。
Sample Input
Sample Output
HINT
样例解释: Vancouver, Edmonton, Montreal, Halifax, Toronto, Winnipeg, Calgary, 和 Vancouver (回到开始城市,但是不算在不同城市之内)。
Solution
看起来很像一道费用流的题,但仔细思考一下我们不难发现动态规划便可以轻松解决,本题也可以通过floyd求最大环来解决。这里主要介绍动态规划的方法。
类似floyd,我们采用邻接表的方式建图,由于需要建立城市与数字之间的映射关系从而建图,大佬们一般用的是map,本蒟蒻不会那么高级的函数,采用暴力循环的方式。
由于要求路径不重复,我们可以把所求的路径分成两段,即从起点出发与回到起点的两条路径,那么假设有两个人分别走这两条路径,从而想出我们的状态:f[i][j]表示一个人到达i,另一个人到达j的状态数。状态转移方程可容易推得:
f[i][j]=max(f[i][k]+1)+1(k,j有航线且1<=k<j且f[i][k]>0)
Code
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define N 110
using namespace std;
int f[N][N],map[N][N];
int n,v;
int ans=;
char a[N],b[N];
void add(int x,int y){map[x][y]=;map[y][x]=;}
struct note
{
int num;
char id[];
}city[N];
void floyd()
{
f[][]=;
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
for(int k=;k<j;k++)
if(map[j][k]&&f[i][k]&&f[i][k]+>f[i][j])
f[i][j]=f[j][i]=f[i][k]+;
for(int i=;i<=n;i++)
if(map[i][n])
ans=max(ans,f[i][n]);
}
int main()
{
scanf("%d%d",&n,&v);
for(int i=;i<=n;i++)
{
scanf("%s",city[i].id+);
city[i].num=i;
}
for(int i=;i<=v;i++)
{
scanf("%s",a+);
scanf("%s",b+);
int x,y;
for(int j=;j<=n;j++)
{
if(strcmp(a+,city[j].id+)==)
x=city[j].num;
if(strcmp(b+,city[j].id+)==)
y=city[j].num;
}
add(x,y);
}
floyd();
printf("%d",ans);
}
洛谷 P2747 Canada Tour 周游加拿大 动态规划的更多相关文章
- 洛谷 P2747 [USACO5.4]周游加拿大Canada Tour 解题报告
P2747 [USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直 ...
- 洛谷 P2747 [USACO5.4]周游加拿大Canada Tour
P2747 [USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直 ...
- [洛谷P2747] [USACO5.4]周游加拿大Canada Tour
洛谷题目链接:[USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行, ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)
洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...
- 【BZOJ3205_洛谷3638】[APIO2013]机器人(动态规划)
题目: 洛谷3638 分析: 卡了一天的神题--(OrzJumpmelon) 首先预处理出从点\(p\)向\(d\)方向出发最终能到达的点\(nxt[p][d]\).这个可以直接记忆化搜索解决.如果出 ...
- 洛谷P2747周游加拿大Canada Tour [USACO5.4] dp
正解:dp 解题报告: 传送门! 其实这题是我做网络流的时候发现了这题,感觉有点像双倍经验,,,? 但是我还不想写网络流的题解,,,因为网络流24题都还麻油做完,,,想着全做完了再写个总的题解什么的( ...
随机推荐
- mockjs,json-server一起搭建前端通用的数据模拟框架教程
无论是在工作,还是在业余时间做前端开发的时候,难免出现后端团队还没完成接口的开发,而前端团队却需要实现对应的功能,不要问为什么,这是肯定存在的.本篇文章就是基于此原因而产出的.希望对有这方面的需求的同 ...
- 设计模式---JDK动态代理和CGLIB代理
Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...
- 如何实现从登录接口响应数据中提取JSESSIONID
通过调用接口,对服务器产生压力,单接口测试,会遇到响应数据返回的是要求先登录.这是我们在调用这个接口时,根据业务逻辑,必须先登录才可以,比如:提交订单,那么就需要先获取用户登录的JSESSIONID, ...
- 吴裕雄--天生自然python机器学习实战:K-NN算法约会网站好友喜好预测以及手写数字预测分类实验
实验设备与软件环境 硬件环境:内存ddr3 4G及以上的x86架构主机一部 系统环境:windows 软件环境:Anaconda2(64位),python3.5,jupyter 内核版本:window ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:让按钮看起来像个链接 (仍然保留按钮行为)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【转】iPhone/IOS使用Fiddler抓包配置
原文链接:https://blog.csdn.net/weixin_39198406/article/details/81123716 1. 安装 安装Fiddler软件2. 配置2.1 端口 点击 ...
- Java 代码空间复杂度查看工具
SourceMonitor 下载地址:http://www.campwoodsw.com/sourcemonitor.html
- window和document的区别理解,bom和dom的区别理解
Window对象: 是整个BOM的核心,所有对象和集合都以某种方式回接到window对象.Window对象表示整个浏览器窗口,但不必表示其中包含的内容. Document对象: 实际上是window对 ...
- php循环语句for while do while的用法
循环结构 一.while循环 while(表达式){ 循环体;//反复执行,直到表达式为假} <?php$num = 1; while ($num <= 10){ print &qu ...
- Day3-F-Buy Low Sell High-CodeForces867E
You can perfectly predict the price of a certain stock for the next N days. You would like to profit ...