1 条题解

  • 0
    @ 2023-11-11 15:19:51
    #include<bits/stdc++.h>
    #define Enter puts("")
    #define Space putchar(' ')
    using namespace std;
    typedef long long ll;
    typedef double Db;
    inline ll Read()
    {
        ll Ans = 0;
        char Ch = getchar() , Las = ' ';
        while(!isdigit(Ch))
        {
            Las = Ch;
            Ch = getchar();
        }
        while(isdigit(Ch))
        {
            Ans = (Ans << 3) + (Ans << 1) + Ch - '0';
            Ch = getchar();
        }
        if(Las == '-')
            Ans = -Ans;
        return Ans;
    }
    inline void Write(ll x)
    {
        if(x < 0)
        {
            x = -x;
            putchar('-');
        }
        if(x >= 10)
            Write(x / 10);
        putchar(x % 10 + '0');
    }
    const int N = 1000000;
    int n , m;
    int Count[N] , Dis[N] , Head[N];
    int Total = 0;
    bool Visit[N] , t;
    queue <int> Q;
    struct Edge{
        int Dis;
        int Next;
        int To;
    }E[2 * N];
    inline void Add_Edge(int u , int v , int w)
    {
        E[++Total].Dis = w;
        E[Total].To = v;
        E[Total].Next = Head[u];
        Head[u] = Total;
    }
    inline bool SPFA()
    {
        for(int i = 0; i <= n; i++)
        {
            Visit[i] = 0;
            Dis[i] = 1e6;
        }
        Visit[0] = 1 , t = 0 , Dis[0] = 0;
        Q.push(0);
        while(!Q.empty())
        {
            int u = Q.front();
            Q.pop();
            Visit[u] = 0;
            for(int i = Head[u]; i;i = E[i].Next)
            {
                int v = E[i].To , w = E[i].Dis;
                if(Dis[v] > Dis[u] + w)
                {
                    Dis[v] = Dis[u] + w;
                    if(Count[v] >= n)
                        return false;
                    if(!Visit[v])
                        Visit[v] = 1 , Count[v]++ , Q.push(v);
                }
            }
        }
        return true;
    }
    int main()
    {
        n = Read() , m = Read();
        for(int i = 1; i <= m; i++)
        {
            int u = Read() , v = Read() , w = Read();
            Add_Edge(v , u , w);
        }
        for(int i = 1; i <= n; i++)
            Add_Edge(0 , i , 0);
        if(SPFA() == false)
            puts("NO");
        else
            for(int i = 1; i <= n; i++)
                Write(Dis[i]) , Space;
        return 0;
    }
    
    • 1

    信息

    ID
    4877
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    10
    已通过
    4
    上传者