1 条题解
-
0

#include <cstdio> #include <cstring> #include <set> #include <map> #include <vector> #include <cmath> #include <queue> #include <algorithm> using namespace std; int n,m; int f[10][310][310],lg,ans; int h[310][310],g[310][310]; int main() { scanf("%d%d",&n,&m); memset(h,0x33,sizeof h); memset(f,0x33,sizeof f); for(int i=1;i<=n;i++) f[0][i][i]=h[i][i]=0; for(int x,y,c,i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&c),f[0][x][y]=c; int flag=0; for(lg=1;lg<=9;lg++) { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[lg][i][j]=min(f[lg][i][j],f[lg-1][i][k]+f[lg-1][k][j]); for(int i=1;i<=n;i++) if(f[lg][i][i]<0) flag=1; if(flag) break; if(1<<(lg)>=n) { printf("0"); return 0; } } for(;lg>=0;lg--) { memcpy(g,h,sizeof h); flag=0; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) h[i][j]=min(h[i][j],g[i][k]+f[lg][k][j]); for(int i=1;i<=n;i++) if(h[i][i]<0) flag=1; if(flag) memcpy(h,g,sizeof g); else ans+=(1<<lg); } printf("%d",ans+1); return 0; }
- 1
信息
- ID
- 6442
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者