题目链接: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)的更多相关文章

  1. [最短路,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 ...

  2. 1204C Anna, Svyatoslav and Maps

    题目大意 给你一个有向图和一个路径 让你在给定路径中选出尽量少的点使得新路径的最短路长度和原路径相等 给定路径相邻两点间距离为1 分析 先floyd求出两点间最短路 之后每次对于点i找到所有跟它的最短 ...

  3. 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 ...

  4. C. Anna, Svyatoslav and Maps

    C. Anna, Svyatoslav and Maps 给定一个有向图,给定一条有向路径,求一条顶点最少的路径,使得给定的路径是它的最短路 folyd预处理出任意两点间的最短路,然后判断是否可以缩点 ...

  5. Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)

    题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...

  6. Codeforces 219D. Choosing Capital for Treeland (树dp)

    题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...

  7. UVA10269 Adventure of Super Mario(Floyd+DP)

    UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs ...

  8. [CodeForces - 1272D] Remove One Element 【线性dp】

    [CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...

  9. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

随机推荐

  1. H5_0012:js事件冒泡和捕获

    捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...

  2. Python3标准库:enum枚举

    1. enum枚举 枚举是一组符号名称(枚举成员)的集合,枚举成员应该是唯一的.不可变的.在枚举中,可以对成员进行恒等比较,并且枚举本身是可迭代的. 1.1 创建枚举 可以使用class语法派生Enu ...

  3. 0004 工程配置settings.py

    两个目录的区别: 工程目录是指包含manage.py文件的目录 配置目录是批包含settings.py文件的目录 在配置目录中找到并打工settings.py文件,做以下配置: 01 DEBUG DE ...

  4. RYU安装教程

    一.使用pip的形式安装RYU 1.首先检查ubuntu中是否存在pip,命令为 sudo pip3 --version 2.如果存在则使用默认版本8.1.1就行不必跟新,否则自己下载一个pip 3. ...

  5. LeetCode 860. 柠檬水找零 (贪心)

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  6. PP: Shallow RNNs: a method for accurate time-series classification on tiny devices

    Problem: time series classification shallow RNNs: the first layer splits the input sequence and runs ...

  7. 《Vue.js实战》--推荐指数⭐⭐⭐⭐

    献上pdf版本的百度网盘链接: https://pan.baidu.com/s/1YRwyR_ygW3tzBx1FbfjO1A 提取码: b255 先来看下目录: 看完这本书大概花了一个星期,走马观花 ...

  8. ScrollView示例(转载)

    // 初始化var scrollView = new ccui.ScrollView(); // 设置方向scrollView.setDirection(ccui.ScrollView.DIR_VER ...

  9. 控制台输出Scanner和BufferedReader区别

    Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键 时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整 ...

  10. ORA-00904: "I_LEVEL": invalid identifier

    问题描述 ORA-00904: "I_LEVEL": invalid identifier 标示符无效