球调!!!!!!
查看原帖
球调!!!!!!
1038651
llamn楼主2024/3/28 21:52
#include <bits/stdc++.h>
#define eggy_ using
#define party namespace 
#define eggy 99999999
eggy_ party std;

int N,I,i,j,k,n,m,t1,t2,t3,e[2001][2001],dis[2001];
bool fns;
struct que
{
    int dt[500002],h = 1,t = 1,ck[2001];
    bool b[2001];
    void ps(int a)
    {
        if (!b[a])
        {
            b[a] = 1;
            dt[t++] = a;
            ck[a]++;    
        }
    }
    void pp()
    {
        b[dt[h]] = 0;
        h++;
    }
    void init()
    {
        h = 1;
        t = 1;
        for (i = 1; i <= n ; i++)
        {
            ck[i] = 0;
            b[i] = 0;
            dt[i] = 0;
        }
    }
};
struct que q;
int main()
{
    scanf("%d",&N);

    for (I = 1; I <= N; I++)
    {
        scanf("%d%d",&n,&m);
        for (i = 1; i <= n; i++)
            for (j = 1; j <= n; j++)
                e[i][j] = ((i == j) ? 0 : eggy);
        
        for (i = 1; i <= m; i++)
        {
            scanf("%d%d%d",&t1,&t2,&t3);
            if (t3 >= 0) 
			{
				e[t1][t2] = min(e[t1][t2],t3);
				e[t2][t1] = min(e[t2][t1],t3);
			}
            else e[t1][t2] = min(e[t1][t2],t3);
        }
        fns = 0;
        q.init();
        q.ps(1);
        for (i = 1; i <= n; i++)
        {
            dis[i] = eggy;
        }dis[1] = 0;
        while (q.h != q.t)
        {
            for (i = 1; i <= n; i++)
            {
                if(dis[i] > dis[q.dt[q.h]] + e[q.dt[q.h]][i])
                {
                    dis[i] = dis[q.dt[q.h]] + e[q.dt[q.h]][i];
                    q.ps(i);
                    
                    if (q.ck[i] >= n)
                    {
                        printf("YES\n");
                        fns = 1;
                        break;
                    }
                    if (fns) break;
                }
            }
            if (fns) break;
            q.pp();            
        }
        if (fns) continue;
        printf("NO\n");
    }
    return 0;
}
2024/3/28 21:52
加载中...