• Luogu P5960 【模板】差分约束算法


    gate

    差分约束系统用来解决:
    给出(n)个变量(x_1...x_n)(m)个形如(x_i-x_j le k)(k)为任意常量)的式子,
    (x_1...x_n)的一组可行解。

    将式子变形为(x_ile x_j + k),发现刚好符合三角形不等式(dis[v]le dis[u]+w[i])的形式。
    对于每个式子,连边(x_j ightarrow x_i),权值为(k)(0)号节点向每个节点连边,权值为(0)
    转化为求单源最短路,(dis[1]...dis[n])即为解。
    由于可能出现负权边,用(SPFA)求解。若出现负环,则无解。

    对于一些其他形式的式子,需要稍作转化:
    (x_i-x_j ge k) 将两边同时乘(-1),将不等号反转。
    (x_i-x_j = k) 拆成两个式子(x_i-x_j le k)(x_i-x_j ge k)

    (code)

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #define MogeKo qwq
    using namespace std;
    
    const int maxn = 1e5+10;
    const int INF = 0x3f3f3f3f;
    
    int n,m,x,y,z,cnt;
    int head[maxn],to[maxn],nxt[maxn],w[maxn];
    int dis[maxn],num[maxn];
    bool vis[maxn];
    
    void add(int x,int y,int z) {
    	to[++cnt] = y;
    	nxt[cnt] = head[x];
    	head[x] = cnt;
    	w[cnt] = z;
    }
    
    bool SPFA(int s) {
    	memset(dis,INF,sizeof(dis));
    	queue <int> q;
    	dis[s] = 0;
    	vis[s] = true;
    	q.push(s);
    	while(!q.empty()) {
    		int u = q.front();
    		q.pop();
    		vis[u] = false;
    		for(int i = head[u]; i; i = nxt[i]) {
    			int v = to[i];
    			if(dis[v] <= dis[u] + w[i]) continue;
    			dis[v] = dis[u] + w[i];
    			if(!vis[v]) {
    				if(++num[v] == n) return false;
    				vis[v] = true;
    				q.push(v);
    			}
    		}
    	}
    	return true;
    }
    
    int main() {
    	scanf("%d%d",&n,&m);
    	for(int i = 1; i <= m; i++) {
    		scanf("%d%d%d",&x,&y,&z);
    		add(y,x,z);
    	}
    	for(int i = 1; i <= n; i++)
    		add(0,i,0);
    	if(!SPFA(0)) printf("NO");
    	else
    		for(int i = 1; i <= n; i++)
    			printf("%d ",dis[i]);
    	return 0;
    }
    
  • 相关阅读:
    数据结构与算法(一)-初识
    程序员如何用技术变现?(取其精华去其糟粕)
    python3 os模块
    实现DevOps需要的工具
    jQuery 简单案例
    jquery添加的html元素按钮为什么不执行类样式绑定的click事件
    centos6 自带python2.6升级python2.7+
    html之多行文本textarea 及下拉框select(12)
    html之input标签(11)
    django(python manage.py imgrate)同步数据库出错后的解决办法
  • 原文地址:https://www.cnblogs.com/mogeko/p/13283007.html
Copyright © 2020-2023  润新知