2 条题解

  • 0
    @ 2026-7-20 1:42:55

    B3611 【模板】传递闭包——题解

    解题思路

    使用 Floyd 的布尔形式。枚举中转点 kk,若当前已知 ii 能到 kkkk 能到 jj,就把 iijj 标为可达。按 k=1nk=1\ldots n 依次加入可用中转点后,矩阵即为传递闭包。

    复杂度分析

    时间复杂度 O(n3)O(n^3),空间复杂度 O(n2)O(n^2)

    C++17 参考代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[105][105];
    int main(){
        ios::sync_with_stdio(false); cin.tie(nullptr);
        int n; cin>>n;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++) if(a[i][k])
                for(int j=1;j<=n;j++) if(a[k][j]) a[i][j]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++) cout<<a[i][j]<<(j==n?'\n':' ');
        }
        return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:55

      #include <bits/stdc++.h> using namespace std; int a[105][105]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(a[i][k]) for(int j=1;j<=n;j++) if(a[k][j]) a[i][j]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<a[i][j]<<(j==n?'\n':' '); } return 0; }

      • 1

      信息

      ID
      4941
      时间
      2000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      2
      已通过
      2
      上传者