1 条题解

  • 0
    @ 2026-4-10 21:24:10

    #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
    上传者