• P1993 小K的农场


    P1993 小K的农场

    这个题,涉及到的知识点是差分约束。

    差分约束,是用来判断不等式是否有解集和求出一组特解的一种方法。

    具体是使用最短(长)路算法。

    观察最短路算法,有一个类似与三角形三边关系的不等式。

    [dis[a]+weight>=dis[b] ]

    其中a与b之间直接连了一条边权为weight的边。 通过我们熟练地做一系列最短路,我们一眼就能看出这是正确的。

    那我们再来看一个不等式(x_1-x_2<=c),其中(c)为常数

    变一个型

    [x_1<=x_2+c ]

    [x_2+c>=x_1 ]

    如果我们把(x_1,x_2)看做一个点。中间连着一条权值为(-c)的边,那么我们我们就可以跑最短路。(或连着一条权值为(c)的边,跑最长路)

    我们先把权值都取负,这样就可以跑最短路。

    为什么? 首先我们是用绝对值来保存特解的。然后跑最短路就是要让绝对值最大(要满足所有的不等式)

    然后对于判断有无解,就是判断有无负环

    比如说(a>=b+1,b>=c+1,c>=a+1)这肯定无解。具体的说明,自己YY去吧

    判断负环还是使用玄学时间复杂度的DFS啦

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=10100;
    struct node
    {
    	int point;
    	int nxt;
    	int weight;
    };
    int head[maxn],tail;
    node line[maxn<<1];
    void add(int a,int b,int c)
    {
    	line[++tail].point=b;
    	line[tail].weight=c;
    	line[tail].nxt=head[a];
    	head[a]=tail;
    }
    bool flag=false;
    int dis[maxn];
    bool vis[maxn];
    void dfs(int now)
    {
    	if(flag)	return ;
    	if(vis[now])
    	{
    		flag=true;
    		return ;
    	}
    	vis[now]=true;
    	for(int i=head[now];i;i=line[i].nxt)
    	{
    		if(dis[line[i].point]>dis[now]+line[i].weight)
    		{
    			dis[line[i].point]=dis[now]+line[i].weight;
    			dfs(line[i].point);
    			if(flag)	return ;
    		}
    	}
    	vis[now]=false;
    }
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	int a,b,c,d;
    	for(int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&a,&b,&c);
    		if(a==1||a==2)
    			scanf("%d",&d);
    		if(a==1)	add(c,b,-d);//b-c>=d  b>=c+d;
    		if(a==2)	add(b,c,d);//b-c<=d  c-b>=-d  c>=b-d;
    		if(a==3)	add(b,c,0),add(c,b,0);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		dfs(i);
    		if(flag)
    		{
    			printf("No");	
    			return 0;
    		}
    	}
    	printf("Yes");
    	return 0;
    }
    /*
    3 3
    3 1 2
    1 1 3 1
    2 2 3 2
    */
    
  • 相关阅读:
    一、操作m'y's'ql
    十三、并发
    十二、异步_实践
    一、数据
    【2019-08-13】琐碎事才是突破
    【2019-08-12】迟到好过没到
    【2019-08-11】别人约我宵夜,我却约人早茶
    【2019-08-10】习惯跟时间有关
    【2019-08-09】一日之计在于晨
    【2019-08-08】少即是多,慢即是快
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9251094.html
Copyright © 2020-2023  润新知