比赛 |
2025暑期集训第5场图论专场 |
评测结果 |
AAAAAAATAAAAA |
题目名称 |
Telephone |
最终得分 |
92 |
用户昵称 |
LikableP |
运行时间 |
1.802 s |
代码语言 |
C++ |
内存使用 |
4.40 MiB |
提交时间 |
2025-07-09 11:53:39 |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
void ParseIn();
void Core();
void WriteOut();
int main() {
freopen("telephone.in", "r", stdin);
freopen("telephone.out", "w", stdout);
ParseIn();
Core();
WriteOut();
return 0;
}
template <typename T> T read();
template <typename T> void write(T, char);
template <typename T> T abs(T);
char readc();
const int MAXN = 5e4 + 10;
const int MAXK = 60;
int n, k;
int a[MAXN];
::std::vector<int> g[MAXK];
::std::vector<int> colors[MAXK];
void ParseIn() {
n = read<int>(), k = read<int>();
for (int i = 1; i <= n; ++i) {
a[i] = read<int>();
colors[a[i]].push_back(i);
}
for (int i = 1; i <= k; ++i) {
for (int j = 1; j <= k; ++j) {
if (readc() == '1') g[i].push_back(j);
}
}
}
::std::priority_queue<::std::pair<int, int>> pq;
int dis[MAXN];
bool vis[MAXN];
void Core() {
memset(dis, 0x3f, sizeof dis);
dis[1] = 0;
pq.push(::std::make_pair(0, 1));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (vis[u]) continue;
vis[u] = true;
for (auto c : g[a[u]]) {
for (auto v : colors[c]) {
int w = abs(v - u);
if (dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
pq.push(::std::make_pair(-dis[v], v));
}
}
}
}
}
void WriteOut() {
write(dis[n] == 0x3f3f3f3f ? -1 : dis[n], '\n');
}
template <typename T> T abs(T x) {
return x < 0 ? -x : x;
}
#define isspace(ch) (ch == ' ' || ch == '\n')
char readc() {
char ch = getchar();
for (; isspace(ch); ch = getchar());
return ch;
}
#undef isspace
#define isdigit(ch) (ch >= '0' && ch <= '9')
template <typename T> T read() {
T res = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
return res * f;
}
#undef isdigit
template <typename T> void write(T x, char ed) {
if (x < 0) x = -x, putchar('-');
int sta[sizeof(T) << 2], top = 0;
do {
sta[++top] = x % 10;
x /= 10;
} while (x);
while (top) {
putchar(sta[top--] ^ 48);
}
putchar(ed);
}