1 条题解

  • 0
    @ 2026-6-17 0:26:32

    // 最短路+逆向思维 Floyd 算法 O(N^3)
    #include<bits/stdc++.h>
    #define min(x,y) (x<y?x:y) //比库函数快
    #define max(x,y) (x>y?x:y)
    using namespace std;
    
    const int N=1010,M=200005;
    int n,m;
    int f[N][N],s[M];
    
    int main(){
      scanf("%d%d",&n,&m);
      memset(f,0x3f,sizeof f);
      for(int i=1; i<=n; i++)f[i][i]=0; //点自己0时刻互达
      for(int i=1,x,y; i<=m; i++){
        scanf("%d%d",&x,&y);
        f[x][y]=m-i+1; //x可达y的最早时间(倒序加边的时间)
      }
      
      for(int k=n; k; k--){ //逆序枚举插点
        for(int i=1; i<=n; i++)if(f[i][k]<M) //如果i可达k
        for(int j=1; j<=n; j++)
          f[i][j]=min(f[i][j],max(f[i][k],f[k][j])); //更新i可达j的最早时间    
        for(int i=k; i<=n; i++)
          if(max(f[k][i],f[i][k])<M) s[max(f[k][i],f[i][k])]++; //累计k与i互达时刻的贡献
      }
      for(int i=1; i<=m; i++) s[i]+=s[i-1]; //贡献的前缀和
      for(int i=m; i>=0; i--) printf("%d ",s[i]); //逆序输出
    }
    
    • 1

    D109 最短路 Floyd 算法[省选联考 2021 A/B 卷] 图函数

    信息

    ID
    7664
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    8
    已通过
    5
    上传者