1 条题解
-
0

// 最短路+逆向思维 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
信息
- ID
- 7664
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 5
- 上传者