Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)
题目链接:传送门
题目大意:
给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p。
思路:
题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi到vi+1的最短路的长度,等于vi到vi+1这两个点在序列p中的下标的差,且vi到vi+2的最短路的长度,小于vi到vi+2在序列p中的下标的差。
如果用dis[u][v] 表示:在题目给出的有向图中,从u出发到v的最短路径的长度。则:
1、p1和pm都是关键点。
2、假设u是之前的最后一个关键点,如果dis[u][pi+1] != dis[u][pi] + 1,则pi就是下一个关键点。
那么用Floyd预处理任意两点间的最短路,就可以O(m)地跑一遍数组p,得到所有的关键点,就是答案了。
代码:O(n3+m)
#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define N 105
#define M 1000005
#define INF 0x3f3f3f3f
#define mk(x) (1<<x) // be conscious if mask x exceeds int
#define sz(x) ((int)x.size())
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mp(a,b) make_pair(a, b)
#define endl '\n'
#define lowbit(x) (x&-x) using namespace std;
typedef long long ll;
typedef double db; /** fast read **/
template <typename T>
inline void read(T &x) {
x = ; T fg = ; char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') fg = -;
ch = getchar();
}
while (isdigit(ch)) x = x*+ch-'', ch = getchar();
x = fg * x;
}
template <typename T, typename... Args>
inline void read(T &x, Args &... args) { read(x), read(args...); } int n, m;
int a[N][N];
bool cant[N][N];
int p[M]; void Folyd() {
memset(cant, false, sizeof cant);
for (int k = ; k <= n; k++) {
for (int i = ; i <= n; i++) if (i != k) {
for (int j = ; j <= n; j++) if (j != i && j != k) {
if (a[i][j] > a[i][k] + a[k][j])
a[i][j] = a[i][k] + a[k][j];
else if (a[i][j] == a[i][k] + a[k][j]) {
cant[i][j] = true;
}
}
}
}
} vector <int> ans;
int main()
{
read(n);
for (int i = ; i <= n; i++) {
string s; cin >> s;
for (int j = ; j <= n; j++) {
if (j == i)
a[i][j] = ;
else if (s[j-] == '')
a[i][j] = ;
else
a[i][j] = 1e5;
}
}
read(m);
for (int i = ; i <= m; i++) {
read(p[i]);
}
Folyd();
int u = p[];
ans.push_back(u);
for (int i = ; i <= m; i++) {
if (a[u][p[i]] > a[u][p[i-]])
continue;
u = p[i-];
ans.push_back(u);
}
ans.push_back(p[m]);
cout << ans.size() << endl;
for (int i = ; i < sz(ans); i++) {
printf("%d%c", ans[i], i == sz(ans)- ? '\n' : ' ');
}
return ;
}
Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)的更多相关文章
- 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 ...
- [最短路,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 ...
- C. Anna, Svyatoslav and Maps
C. Anna, Svyatoslav and Maps 给定一个有向图,给定一条有向路径,求一条顶点最少的路径,使得给定的路径是它的最短路 folyd预处理出任意两点间的最短路,然后判断是否可以缩点 ...
- codeforces 1204C Anna, Svyatoslav and Maps(floyd+dp)
题目链接:http://codeforces.com/problemset/problem/1204/C 给定一组序列,P1,P2,P3...Pm,这是一组合法路径的序列,即任意的Pi和Pi+1之间有 ...
- 1204C Anna, Svyatoslav and Maps
题目大意 给你一个有向图和一个路径 让你在给定路径中选出尽量少的点使得新路径的最短路长度和原路径相等 给定路径相邻两点间距离为1 分析 先floyd求出两点间最短路 之后每次对于点i找到所有跟它的最短 ...
- POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...
- Codeforces Round #581(Div. 2)
Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...
- CodeForces 1204 (#581 div 2)
传送门 A.BowWow and the Timetable •题意 给你一个二进制数,让你求小于这个数的所有4的幂的个数 •思路 第一反应是二进制与四进制转换 (其实不用真正的转换 QwQ) 由于二 ...
- CF#581 (div2)题解
CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include< ...
随机推荐
- Java -- 通过 URLConnection 进行http请求中文乱码
对writer和reader指定字符集 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8 ...
- 第三章 SpringCloud之Eureka-Client服务提供者
1.Eureka-Client简介 #################接下来开始程序啦########################## 1.pom.xml <?xml version=&qu ...
- ORACLE官方全托管驱动 Oracle.ManagedDataAccess 12.1.0.1.0
以前用Oracle的时候,必须得装他臃肿的客户端,网上虽然也有提供直连Oracle的驱动,但也是要收费的,最近Oracle终于开窍了,提供了官方的全托管驱动. 这次是随Oracle ODAC 12c ...
- Idea创建项目后,提交项目到码云的问题
1.创建git仓库:vcs->import int version control->Create git repository 2.在项目头点击右键->git->add 3. ...
- java:异常机制(try,catch,finally,throw,throws,自定义异常)
* String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...
- Golang基础(7):go的net/rpc用法
一:PRC是什么? RPC(Remote Procedure Call) 远程过程调用,是一个计算通信协议.该协议允许一台计算机上的程序调用另外一台计算机上的程序.远程过程调用就是2个不在同一台计算机 ...
- normalization(统计)
In statistics and applications of statistics, normalization can have a range of meanings.[1] In the ...
- MyBatis框架原理1:构建SqlSessionFactory的过程
SqlSessionFactoryBuilder 首先创建了一个SqlSessionFactoryBuilder对象,然后调用该对象的build方法加载全局XML配置的流文件构建出一个SqlSessi ...
- 什么是redis?常用的命令有哪些?
1.什么是redis? redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发.高扩展,大数据存储等一系列的问题而产生的数据库 ...
- 【Qt开发】QTableWidget设置根据内容调整列宽和行高
QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents(); 根据内容调整列宽 ...