C. Anna, Svyatoslav and Maps(floyd + 思维)

news/2025/3/14 21:34:46/

Problem - C - Codeforces

给你一个有n个顶点的无权图,以及由m个顶点的序列p1,p2,...,pm给出的路径(该路径不一定简单);对于每个1≤i<m,有一个弧从pi到pi+1。

如果v是p的子序列,v1=p1,vk=pm,并且p是按顺序通过v1,...,vk的最短路径之一,则定义k顶点的序列v1,v2,...,vk为好。

如果一个序列a可以通过删除几个(可能是零个或全部)元素从b中得到,那么这个序列a就是一个序列b的子序列。很明显,序列p是好的,但你的任务是找到最短的好子序列。

如果有多个最短的好子序列,请输出其中任何一个。

输入
第一行包含一个整数n(2≤n≤100)--图形中顶点的数量。

接下来的n行通过邻接矩阵定义图形:如果有一个从顶点i到顶点j的弧,第i行的第j个字符就等于1,否则就等于0。

下一行包含一个整数m(2≤m≤106)--路径中顶点的数量。

下一行包含m个整数p1,p2,...,pm(1≤pi≤n)--路径中顶点的序列。保证任何1≤i<m的情况下,都有一个弧从pi到pi+1。

输出
在第一行输出一个整数k (2≤k≤m) - 最短好子序列的长度。在第二行输出k个整数v1, ..., vk (1≤vi≤n) - 子序列中的顶点。如果有多个最短子序列,则打印任何一个。任何两个连续的数字都应该是不同的。

例子
输入
4
0110
0010
0001
1000
4
1 2 3 4

输出
3
1 2 4

输入
4
0110
0010
1001
1000
20
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4

输出
11
1 2 4 2 4 2 4 2 4 2 4

输入
3
011
101
110
7
1 2 3 1 3 2 1

输出
7
1 2 3 1 3 2 1

输入
4
0110
0001
0001
1000
3
1 2 4

输出
2
1 4
题解:
(先入为主,觉得点数很大,不知道咋记录任意两点距离,好久没写floyd,忘了往这方面想了(点数很小))

首先存边(记得i == j可能是1,但是存边要把其看作0)坑点

跑floyd记录任意两点间最短距离,

起点存入答案数组,从i = 2开始,记录目前距离res为0

如果答案数组的top到b[i]的距离 < b[i-1] 到b[i]的距离,说明中间走的不是最短路,把b[i-1]存进去,res 更改为d[b[i-1]][b[i]],否则res += d[b[i-1]][b[i]],最后别忘了把b[m]也存到答案数组

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
char s[104][104];
int d[104][104];
int b[1000050];
int ans[1000050];
void solve()
{int n;cin >> n;
//	memset(d,0x3f,sizeof d);for(int i = 1;i <= n;i++){cin >> s[i] + 1;for(int j = 1;j <= n;j++){if(s[i][j] == '1'){d[i][j] = 1;}else{d[i][j] = 1e9;}if(i == j)d[i][j] = 0;}}for(int k = 1;k <= n;k++){for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){d[i][j] = min(d[i][j],d[i][k] + d[k][j]);}}}int m;cin >> m;for(int i = 1;i <= m;i++){cin >> b[i];}int cnt = 0;ans[++cnt] = b[1];int res = 0;for(int i = 2;i <= m;i++){res += d[b[i - 1]][b[i]];if(d[ans[cnt]][b[i]] < res){ans[++cnt] = b[i - 1];res = d[b[i - 1]][b[i]];}}ans[++cnt] = b[m];cout << cnt <<"\n";for(int i = 1;i <= cnt;i++)cout <<ans[i] << " ";
}signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);int t = 1;
//	cin >> t;while(t--){solve(); }
}


http://www.ppmy.cn/news/48130.html

相关文章

JavaScript有几种数据类型,分别是什么?

在JavaScript中&#xff0c;我们可以分成两种类型&#xff1a;基本类型 复杂类型&#xff08;引用类型&#xff09; 两种类型的区别是&#xff1a;存储位置不同 基本类型主要为以下六种&#xff1a; Number、String、Boolean、Undefined、Null、Symbol 复杂类型/引用类型统称为…

C++ const关键字

参考资料&#xff1a; 【C const的各种用法详解】【const用法深入浅出】 - COS - 博客园 (cnblogs.com) const的基本概念&#xff1a; const名叫常量限定符&#xff0c;用来限定特定变量&#xff0c;以通知编译器该变量是不可修改的。习惯性的使用const&#xff0c;可以避免在函…

PostgreSQL环境搭建和主备构建

目录 1 Windows 上安装 PostgreSQL2 docker安装PostgreSQL2.1 检索当前镜像2.2. 拉取当前镜像2.3 创建挂载文件夹2.4 启动镜像2.5 查看日志2.7 查看进程2.8 使用连接 3 postgresql主从主备搭建3.1 安装好网络源&#xff08;主1.11、从1.12&#xff09;3.2 安装postgresql&#…

Python OpenCV 3.x 示例:1~5

原文&#xff1a;OpenCV 3.x with Python By Example 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最…

一定要会的算法复杂度分析

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 原作者&#xff1a;s09g|慕课网讲师 我们知道面对同一道问题时可能有多种解决方案。自然地&#xff0c;我们会将多种方法进行比较。那么…

同样是测试,朋友到了30k,我才12K,这份测试面试8股文确实牛

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而&#xff0c;小编要说的是&#xff0c;不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿&#xff0c;薪资的差别还是很大的。 众所周知&#xff0c;目前互联网行业是众多行业中薪资待遇最好的&#xff0c;…

Leetcode33.搜索旋转排列数组

搜索旋转排列数组 一、题目描述&#xff1a;二、解决思路和代码1. 解决思路2. 代码 一、题目描述&#xff1a; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length…

【Unity VR开发】结合VRTK4.0:添加遮蔽追踪器

语录&#xff1a; 恋爱应该是双方扶持对方共同完成自己的目标&#xff0c;而不是虚幻的思想、肤浅的物质、和纸醉金迷的生活。 前言&#xff1a; 遮蔽追踪器&#xff08;Trackers.ObscuranceTracker&#xff09;是基于游戏对象存在或不可见之间切换对象的状态&#xff0c;从而遮…