linhanmo @ 2024-11-19 18:30:33
能不能帮个忙,C++?
【题目描述】
翠江城是一个交通发展的城市,城里的地铁四通八达。地铁一共有 n个站点,m条线路,每条线路连接两个站点,可以在这两个站点之间双向通行。特殊的是,翠江城的地铁由多家公司运营,乘坐每家公司的地铁都需要 1 元钱,但换乘同一家公司的地铁不需要再次付费。小 D 想从 1 号站点前往 n 号站点,他想知道最小费用是多少。 【输入格式】
输入第一行有两个正整数 n,m 表示站点数和线路数。 接下来 m 行,每行三个整数 pi,qi,ci,表示这条线路连接的两个站点以及运营它的公司编号。 【输出格式】
输出仅包括一行一个整数,表示答案。如果无法到达,输出 -1。
样例输入
8 11
1 3 1
1 4 2
2 3 1
2 5 1
3 4 3
3 6 3
3 7 3
4 8 4
5 6 1
6 7 5
7 8 5
样例输出
2
样例解释
先乘坐公司 1 的地铁 1→3→2→5→6,然后乘坐公司 5 的地铁 6→7→8。
【数据范围】
对于30% 的数据,满足n≤1000,m≤2000。
对于另外20% 的数据,满足 ci≤4。
对于 100%的数据,满足2≤n≤10^5,1≤m≤2×10 ^5 ,1≤ci≤10^6 ,pi!=qi.
by linhanmo @ 2024-11-19 18:55:39
原代码60分
#include <bits/stdc++.h>
using namespace std;
inline unsigned read(unsigned &x) {
x = 0;
char ch = getchar();
while(!isdigit(ch)) ch = getchar();
while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x;
}
vector<pair<int,int> > g[100005];
queue<pair<int, int> > q;
unsigned n, m, mc = INT_MAX, c[200005][101];
int main() {
read(n), read(m);
memset(c,0x3f,sizeof(c));
for (unsigned i = 0, p, q, c; i < m; ++i) read(p), read(q), read(c), g[p].push_back({q, c}), g[q].push_back({p, c});
q.push({1, -1}), c[1][0] = 0;
while (!q.empty()) {
auto [cr, second] = q.front();
q.pop();
for (const auto & ed : g[cr]) {
unsigned i = ed.first, c_ = ed.second, _c;
_c = c[cr][second == -1 ? 0 : second];
if (c_ != second) ++_c;
if (_c < c[i][c_]) c[i][c_] = _c, q.push({i, c_});
}
}
for (unsigned i = 0; i < 101; ++i) mc = min(mc, c[n][i]);
if (mc == 1061109567) printf("-1");
else printf("%d", mc);
return 0;
}
by linhanmo @ 2024-11-19 18:58:39
1 Accepted10 87ms 85.8 MiB
2 Wrong Answer0 43ms 79.8 MiB
3 Accepted10 108ms 87.5 MiB
4 Wrong Answer0 184ms 84.3 MiB
5 Wrong Answer0 43ms 80.1 MiB
6 Accepted10 74ms 85.2 MiB
7 Accepted10 133ms 84.3 MiB
8 Wrong Answer0 43ms 79.9 MiB
9 Accepted10 146ms 87.1 MiB
10 Accepted10 145ms 87.6 MiB