样例全对,测试全wa

P2169 正则表达式

最新代码 ```cpp #include <bits/stdc++.h> using namespace std; const int N = 20010; int n, m, a, b, c; vector<int> e[N]; vector<int> len[N]; queue<int>q; int Map[N][N]; int dfn[N], low[N], tot; int instk[N]; int scc[N], siz[N], cnt; long long dis[N],num[N]; bool vis[N]; stack<int>st; void tarjan(int x) { dfn[x] = low[x] = ++tot; st.push(x); instk[x] = 1; for (int y : e[x]) { if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); } else if (instk[y]) low[x] = min(low[x], dfn[y]); } if (dfn[x] == low[x]) { int y; ++cnt; do { y = st.top(); st.pop(); instk[y] = 0; scc[y] = cnt; ++siz[cnt]; } while (y != x); } } void SPFA(int x) { while (q.size()) q.pop(); for (int i = 1; i <= cnt; i++) { dis[i] = INT_MAX; } dis[x] = 0; q.push(x); while (!q.empty()) { int temp = q.front(); q.pop(); for (int j = 1; j <= cnt; j++) { if (dis[j] > Map[temp][j] + dis[temp]) { dis[j] = dis[temp] + Map[temp][j]; if (!vis[j]) { q.push(j); vis[j] = 1; num[j]++; } } } vis[temp] = 0; } } int main() { cin >> n >> m; while (m--) cin >> a >> b >> c, e[a].push_back(b), len[a].push_back(c); for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= cnt; i++) for (int j = 1; j <= cnt; j++) Map[i][j] = INT_MAX; for (int i = 1; i <= cnt; i++) Map[i][i] = 0; for (int i = 1; i <= n; i++) for (unsigned int j = 0 ; j < e[i].size(); j++) if (scc[i] == scc[e[i][j]]) Map[scc[i]][scc[e[i][j]]] = 0; else Map[scc[i]][scc[e[i][j]]] = min(Map[i][scc[e[i][j]]], len[i][j]); SPFA(scc[1]); cout << dis[scc[n]]; return 0; }
by kimi0705 @ 2022-12-26 18:36:45


@[EndCentury](/user/320616) 我测的是对的
by kimi0705 @ 2023-01-01 15:54:13


``` 3 3 1 2 1 2 3 1 3 1 1 0 -------------------------------- Process exited after 0.721 seconds with return value 0, 71212 KB mem used. Press ANY key to exit... ```
by kimi0705 @ 2023-01-01 15:54:51


3 3 1 2 1 2 3 1 1 3 4
by EndCentury @ 2023-01-01 16:05:34


``` #include <bits/stdc++.h> using namespace std; const int N = 20010; int n, m, a, b, c; vector<int> e[N]; vector<int> len[N]; queue<int>q; int Map[N][N]; int dfn[N], low[N], tot; int instk[N]; int scc[N], siz[N], cnt; long long dis[N],num[N]; bool vis[N]; stack<int>st; void tarjan(int x) { dfn[x] = low[x] = ++tot; st.push(x); instk[x] = 1; for (int y : e[x]) { if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); } else if (instk[y]) low[x] = min(low[x], dfn[y]); } if (dfn[x] == low[x]) { int y; ++cnt; do { y = st.top(); st.pop(); instk[y] = 0; scc[y] = cnt; ++siz[cnt]; } while (y != x); } } void SPFA(int x) { while (q.size()) q.pop(); for (int i = 1; i <= cnt; i++) { dis[i] = INT_MAX; } dis[x] = 0; q.push(x); while (!q.empty()) { int temp = q.front(); q.pop(); for (int j = 1; j <= cnt; j++) { if (dis[j] > Map[temp][j] + dis[temp]) { dis[j] = dis[temp] + Map[temp][j]; if (!vis[j]) { q.push(j); vis[j] = 1; num[j]++; } } } vis[temp] = 0; } } int main() { cin >> n >> m; while (m--) cin >> a >> b >> c, e[a].push_back(b), len[a].push_back(c); for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= cnt; i++) for (int j = 1; j <= cnt; j++) Map[i][j] = INT_MAX; for (int i = 1; i <= cnt; i++) Map[i][i] = 0; for (int i = 1; i <= n; i++) for (unsigned int j = 0 ; j < e[i].size(); j++) if (scc[i] == scc[e[i][j]]) Map[scc[i]][scc[e[i][j]]] = 0x3f3f3f3f; else Map[scc[i]][scc[e[i][j]]] = len[i][j]; SPFA(scc[1]); cout << dis[scc[n]]; return 0; } ``` 79分。。。
by EndCentury @ 2023-01-01 16:06:54


你改了哪里?
by kimi0705 @ 2023-01-01 16:31:00


为什么要把那个len啊?改成最大值?还有为什么要把那个min去掉
by kimi0705 @ 2023-01-01 16:33:04


他不做成了一个点吗
by kimi0705 @ 2023-01-01 16:33:34


自己点到自己点距离应该零啊
by kimi0705 @ 2023-01-01 16:34:33


@[EndCentury](/user/320616)
by kimi0705 @ 2023-01-01 16:35:02


| 下一页