社区讨论
在线求助代码复杂度
学术版参与者 10已保存回复 38
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 38 条
- 当前快照
- 1 份
- 快照标识符
- @mkcnjg4s
- 此快照首次捕获于
- 2026/01/13 21:53 上个月
- 此快照最后确认于
- 2026/01/17 14:50 上个月
CPP
#include <bits/stdc++.h>
#define ll long long
#define pii pair <int, int>
#define pll pair <ll, ll>
#define fi first
#define se second
#define y1 noip200
using namespace std;
const int N = 5e5 + 50, p = 1e9 + 7, inf = 1 << 29;
int n, m, s, t;
int dist[N];
set <pii> q;
vector <pii> e[N];
void init() {
}
void dijkstra(int S) {
memset(dist, 127, sizeof(dist));
dist[S] = 0;
q.clear();
for (int i = 1; i <= n; i++) q.insert({dist[i], i});
while (!q.empty()) {
int u = q.begin()->se;
q.erase(q.begin());
for (auto [v, w] : e[u])
if (dist[v] > dist[u] + w) {
q.erase({dist[v], v});
dist[v] = dist[u] + w;
q.insert({dist[v], v});
}
}
}
void solve() {
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
e[u].push_back({v, 0});
e[v].push_back({u, 0});
}
for (int i = 0; i < e[s].size(); i++)
e[s][i].se = 1;
for (int i = 0; i < e[t].size(); i++)
e[t][i].se = 0;
dijkstra(t);
int cnt1 = 0, cnt2 = 0;
for (int i = 1; i <= n; i++)
if (dist[i])
++cnt1;
for (int i = 0; i < e[s].size(); i++)
e[s][i].se = 0;
for (int i = 0; i < e[t].size(); i++)
e[t][i].se = 1;
dijkstra(s);
for (int i = 1; i <= n; i++)
if (dist[i])
++cnt2;
cout << 1LL * cnt1 * cnt2 << endl;
for (int i = 1; i <= n; i++) e[i].clear();
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}
大概是 ,都是 量级,为什么会超时?
回复
共 38 条回复,欢迎继续交流。
正在加载回复...