• 洛谷3385 【模板】负环


    一道负环模板

    原题链接

    负环模板,不解释。

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N = 2010;
    const int M = 3010;
    int fi[N], di[M << 1], ne[M << 1], da[M << 1], dis[N], cnt[N], q[N << 10], l;
    bool v[N];
    inline int re()
    {
    	int x = 0;
    	char c = getchar();
    	bool p = 0;
    	for (; c<'0' || c>'9'; c = getchar())
    		p |= c == '-';
    	for (; c >= '0'&&c <= '9'; c = getchar())
    		x = x * 10 + (c - '0');
    	return p ? -x : x;
    }
    inline void add(int x, int y, int z)
    {
    	di[++l] = y;
    	da[l] = z;
    	ne[l] = fi[x];
    	fi[x] = l;
    }
    int main()
    {
    	int i, n, m, t, head, tail, x, y, z;
    	bool p;
    	t = re();
    	while (t--)
    	{
    		n = re();
    		m = re();
    		l = 0;
    		memset(fi, 0, sizeof(fi));
    		memset(dis, 60, sizeof(dis));
    		memset(cnt, 0, sizeof(cnt));
    		memset(v, 0, sizeof(v));
    		for (i = 1; i <= m; i++)
    		{
    			x = re();
    			y = re();
    			z = re();
    			add(x, y, z);
    			if (z >= 0)
    				add(y, x, z);
    		}
    		head = 0;
    		tail = p = 1;
    		dis[1] = 0;
    		q[1] = 1;
    		while (head != tail && p)
    		{
    			x = q[++head];
    			v[x] = 0;
    			for (i = fi[x]; i; i = ne[i])
    			{
    				y = di[i];
    				if (dis[y] > dis[x] + da[i])
    				{
    					dis[y] = dis[x] + da[i];
    					cnt[y] = cnt[x] + 1;
    					if (cnt[y] >= n)
    					{
    						p = 0;
    						break;
    					}
    					if (!v[y])
    					{
    						q[++tail] = y;
    						v[y] = 1;
    					}
    				}
    			}
    		}
    		if (p)
    			printf("N0
    ");
    		else
    			printf("YE5
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    linux创建用户
    Java理解笔记------杂项
    java高效并发
    GPG备份秘钥
    (二)数据同步利器syncthing
    (一)安装samba
    (序)利旧打造私有云
    mysql的docker化安装
    (八)netty的SSL renegotiation攻击漏洞
    (七)json序列化
  • 原文地址:https://www.cnblogs.com/Iowa-Battleship/p/9614772.html
Copyright © 2020-2023  润新知