From 4377432f8362e841d8cdd12a931bc0fd45792f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 5 Jan 2024 10:21:55 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HDU1704.cpp | 36 +++++++++++++++++ TangDou/Topic/HDU3631.cpp | 50 +++++++++++++++++++++++ TangDou/Topic/【Floyd专题】.md | 65 +++++++++++++++++++++++++++--- 3 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 TangDou/Topic/HDU1704.cpp create mode 100644 TangDou/Topic/HDU3631.cpp diff --git a/TangDou/Topic/HDU1704.cpp b/TangDou/Topic/HDU1704.cpp new file mode 100644 index 0000000..e8872fb --- /dev/null +++ b/TangDou/Topic/HDU1704.cpp @@ -0,0 +1,36 @@ +#include +using namespace std; +#define inf 0x3f3f3f3f +const int N = 510; +int n, m, x, y, ans; +int g[N][N]; + +void floyd() { + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) { + if (!g[i][k]) continue; // floyd优化 + for (int j = 1; j <= n; j++) + g[i][j] |= g[i][k] & g[k][j]; // 通过k传递,或运算 + } +} +int main() { + int T; + cin >> T; + while (T--) { + cin >> n >> m; + memset(g, 0, sizeof g); + while (m--) { + cin >> x >> y; + g[x][y] = 1; // x +using namespace std; +#define inf 0x3f3f3f3f +const int N = 310; +int t, n, m, q, u, v, w; +int mp[N][N]; +bool flag[N]; // 记录是否标记 + +void floyd(int k) { + for (int i = 0; i < n; ++i) + for (int j = 0; j < n; ++j) + if (mp[i][j] > mp[i][k] + mp[k][j]) + mp[i][j] = mp[i][k] + mp[k][j]; +} +int main() { + while (cin >> n >> m >> q && n + m + q) { + if (t != 0) printf("\n"); // 谜之格式 + printf("Case %d:\n", ++t); + memset(mp, inf, sizeof(mp)); + memset(flag, false, sizeof(flag)); + for (int i = 0; i <= n; ++i) + mp[i][i] = 0; + while (m--) { + scanf("%d %d %d", &u, &v, &w); + if (w < mp[u][v]) + mp[u][v] = w; + } + while (q--) { + scanf("%d", &w); + if (w == 0) { + scanf("%d", &u); + if (flag[u]) + printf("ERROR! At point %d\n", u); + else { + flag[u] = true; + floyd(u); + } + } else { + scanf("%d %d", &u, &v); + if (!(flag[u] && flag[v])) + printf("ERROR! At path %d to %d\n", u, v); + else if (mp[u][v] == inf) + printf("No such path\n"); + else + printf("%d\n", mp[u][v]); + } + } + } + return 0; +} \ No newline at end of file diff --git a/TangDou/Topic/【Floyd专题】.md b/TangDou/Topic/【Floyd专题】.md index 5ce48c2..e1ea57c 100644 --- a/TangDou/Topic/【Floyd专题】.md +++ b/TangDou/Topic/【Floyd专题】.md @@ -95,7 +95,7 @@ int main() { } ``` -### 四、练习题 +### 四、打印路径 #### [$HDU-1385$ $Minimum$ $Transport$ $Cost$](http://acm.hdu.edu.cn/showproblem.php?pid=1385) @@ -186,7 +186,7 @@ int main() { } ``` - +### 五、最小环 #### [$HDU$-$1599$ $find$ $the$ $mincost$ $route$](https://acm.hdu.edu.cn/showproblem.php?pid=1599) **类型: 最小环** @@ -266,14 +266,67 @@ signed main() { } } ``` - +### 六、传递闭包 #### [$HDU$-$1704$ $Rank$](https://acm.hdu.edu.cn/showproblem.php?pid=1704) -(传递闭包) + +**题意** +给出$M$对胜负关系,胜负关系有传递性(若$A$胜$B$,$B$胜$C$则$A$胜$C$), **求有多少对不能确定的胜负关系** + +**解法**:思路很简单,$floyd$ 一遍做传递闭包,然后暴力枚举就行辣,但是竟然会$TLE$,然后上网学了一种新的优化姿势(其实这种优化用处不大,但由于本题是非常稀疏的图,所以$O(N^3)$几乎变成了$O(N^2)$) + +```cpp {.line-numbers} +#include +using namespace std; +#define inf 0x3f3f3f3f +const int N = 510; +int n, m, x, y, ans; +int g[N][N]; + +void floyd() { + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) { + if (!g[i][k]) continue; // floyd优化 + for (int j = 1; j <= n; j++) + g[i][j] |= g[i][k] & g[k][j]; // 通过k传递,或运算 + } +} +int main() { + int T; + cin >> T; + while (T--) { + cin >> n >> m; + memset(g, 0, sizeof g); + while (m--) { + cin >> x >> y; + g[x][y] = 1; // x