codeforces 1204C Anna, Svyatoslav and Maps(floyd+dp)
题目链接:http://codeforces.com/problemset/problem/1204/C
给定一组序列,P1,P2,P3...Pm,这是一组合法路径的序列,即任意的Pi和Pi+1之间有边相连,求一组新的序列V,V为原序列P的子集(通过删除P中某些元素获得), 且顺序遍历V序列中的各个顶点时,P序列这组路径是遍历所有V序列顶点的最短路径,输出V序列元素的个数和V序列各个元素。
思路:首先floyd计算各个顶点相互之间到达的最短路径dist[ i ] [ i+1 ](i到i+1的最短路) ,设cur为目前放入所求答案序列的最后一个元素,开始遍历P序列的元素,设目前遍历到的元素是P[ i ],如果cur按照P序列中的元素顺序走到 P[ i ] 的距离 > dist [ cur ] [ i ],则说明按照cur 在P中,顺序遍历各个元素到P[ i ] 所走的是最短路径,但是因为经过 P[ i -1 ]到P[ i ],才使得 其小于cur到P[ i ]的最短路,所以如果按照dist[cur][ P[ i ] ]这条路走,就不会经过P[ i-1 ],这就不符合P序列的遍历顺序,为了经过P[ i-1 ],我们把P[ i-1 ]放入V中,替换 cur = P [ i -1 ] ,依次类推不断更新直到最后一个元素。
具体看AC代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define maxn 105
#define inf 0x3f3f3f3f
using namespace std;
vector<string> g;
vector<int> ans;
int dist[maxn][maxn];
int p[1000005];
int n,m,dis,cur;
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j]=min(dist[i][j],dist[i][k] + dist[k][j]);
}
}
}
}
int main(){
cin>>n;
for(int i = 0;i<n;i++){
string t;
cin>>t;
g.push_back(t);
}
memset(dist,inf,sizeof(dist));
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(g[i][j] == '1'){
dist[i+1][j+1] = 1;
}
if(i==j){
dist[i+1][j+1] = 0;
}
}
}
floyd();
cin>>m;
for(int i = 1;i<=m;i++){
cin>>p[i];
}
ans.push_back(p[1]);
cur = p[1],dis = 0;
for(int i = 2;i<=m;i++){
dis+=dist[p[i-1]][p[i]];
if(dis > dist[cur][p[i]]){
ans.push_back(p[i-1]);
cur = p[i-1];
dis = dist[cur][p[i]];
}
}
ans.push_back(p[m]);
cout<<ans.size() <<endl;
for(int i = 0;i<ans.size() ;i++){
if(i){
cout<<" "<<ans[i];
}
else{
cout<<ans[i];
}
}
return 0;
}
codeforces 1204C Anna, Svyatoslav and Maps(floyd+dp)的更多相关文章
- [最短路,floyd] Codeforces 1204C Anna, Svyatoslav and Maps
题目:http://codeforces.com/contest/1204/problem/C C. Anna, Svyatoslav and Maps time limit per test 2 s ...
- 1204C Anna, Svyatoslav and Maps
题目大意 给你一个有向图和一个路径 让你在给定路径中选出尽量少的点使得新路径的最短路长度和原路径相等 给定路径相邻两点间距离为1 分析 先floyd求出两点间最短路 之后每次对于点i找到所有跟它的最短 ...
- Codeforces Round #581 (Div. 2) C. Anna, Svyatoslav and Maps (Floyd 算法,最短路)
C. Anna, Svyatoslav and Maps time limit per test2 seconds memory limit per test256 megabytes inputst ...
- C. Anna, Svyatoslav and Maps
C. Anna, Svyatoslav and Maps 给定一个有向图,给定一条有向路径,求一条顶点最少的路径,使得给定的路径是它的最短路 folyd预处理出任意两点间的最短路,然后判断是否可以缩点 ...
- Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)
题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...
- Codeforces 219D. Choosing Capital for Treeland (树dp)
题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...
- UVA10269 Adventure of Super Mario(Floyd+DP)
UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
随机推荐
- musql 单表查询
一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...
- 0级搭建类010-Oracle Linux 6.x安装(OEL 6.10) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- 折半枚举+Hash(HDU1496升级版)
题目链接:N - 方程的解 给定一个四元二次方程: Ax1^2+Bx2^2+Cx3^2+Dx4^2=0 试求−1000≤x1,x2,x3,x4≤1000非零整数解的个数. −10000≤A,B,C,D ...
- mysql常用函数及关键字汇总
关键字 1...mysql包含之in SELECT count(1) as count FROM 表名 a,表名 b WHERE a.主键 = b.外键 and a.字段 in('1','2,'3' ...
- 【并发那些事】线程有序化神器CompletionService
前言 话说有一天,产品经理突然找到正在摸鱼的你. 产品:『我们要加一个聚合搜索功能,当用户在我们网站查询一件商品时,我们分别从 A.B.C 三个网站上查询这个信息,然后再把得到的结果返回给用户』 你: ...
- java_HashMap的遍历方法_4种
1.通过接收keySet来遍历: HashMap<String,String> map = new HashMap<>(); map.put("bb",&q ...
- C语言链表头插法逆向输出
输入:1 2 3 4 5 -1 输出:5 4 3 2 1 此题考查头链表的创建之一 :头插法.所谓头插法是从一个空链表开始,重复读入数据,生成新结点,将读入的数据存放新结点的数据域中,然后讲新结点插入 ...
- python3运行调用htmltestrunner时,报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0
之前解决过一次,又忘了,这次写下来了..百度没有的,跟我环境有关! 环境:自动化运行环境python3.6.5 上期说到了,写了一个bat来运行runallcase.py. 但是双击运行却报错:Uni ...
- eclipse下载更新可用的SDK 2018-11-12
懒人方法: mirrors.neusoft.edu.cn:80 操作步骤: 1. Android SDK Manager----Tools----Options-----Http Proxy Serv ...
- cc.formatStr()用法
cc.formatStr() 第一个变量为含有 %s 或 %d 的字符串 后面依次为%s或%d对应的内容