首页 > 其他分享 >差分约束模板补坑与学习

差分约束模板补坑与学习

时间:2022-10-09 11:56:06浏览次数:76  
标签:le int 差分 vis read 补坑 模板 dis

很久以前就学了差分约束,但是一直没搞懂,也懒得搞懂。今天看板子,脑补了几秒钟突然就懂了。

对于一个不等式, \(x_i - x_j \le k\), 可以变形: \(x_i \le x_j + k\) 。这跟最短路的判断是一样的。

用一张图来辅助理解:
666

从 \(i\) 到 \(w\) 跑最短路,首先我们满足了 \(i\) 和 \(j\) 间的关系,然后又满足了 \(j\) 和 \(w\) 间的关系,因此得到一组解。不难发现,使用最短路得到的解均为最大解。

同时,注意判断无解的情况:即存在负环,
hehehe

对于最简单的这种负环情况,原始不等式为: \(x_i \le x_j - 1\) \(x_j \le x_i - 1\) 显然这时是不成立的。

最后,附上洛谷P4878,半模板的差分约束代码:


#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
	while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
	a = x * s;
	return ;
}

struct node{
  int u, v, w, next;
} t[N << 1];
int head[N];

int bian = 0;
inline void addedge(int u, int v, int w){
  t[++bian] = (node){u, v, w, head[u]}, head[u] = bian;
  return ; 
}

int n, m1, m2; 

queue <int> q; 
ll dis[N]; 
int vis[N]; 

int maxn_tmp = 0; 
void spfa(int s){
  memset(dis, 0x3f3f3f3f, sizeof(dis)); 
  memset(vis, 0, sizeof(vis)); 
  maxn_tmp = dis[0]; 
  q.push(s); 
  dis[s] = 0;
  while(!q.empty()){
    int u = q.front(); q.pop();
    for(int i = head[u]; i; i = t[i].next){
      int v = t[i].v; 
      if(dis[v] > dis[u] + t[i].w){
        dis[v] = dis[u] + t[i].w; 
        vis[v]++; 
        if(vis[v] > n){
          printf("-1");
          exit(0); 
        }
        q.push(v); 
      }
    }
  }
  return ; 
}

bool in[N]; 

int main(){
  // freopen("hh.txt", "r", stdin); 
  read(n), read(m1), read(m2);
  for(int i = 1; i <= m1; i++){
    int x, y, w; 
    read(x), read(y), read(w);
    addedge(x, y, w); 
    in[x] = 1, in[y] = 1; 
  }
  for(int i = 1; i <= m2; i++){
    int x, y, w; 
    read(x), read(y), read(w); 
    addedge(y, x, -w); 
  }
  for(int i = 1; i <= n; i++)
    addedge(0, i, 0), addedge(i + 1, i, 0);    // 隐藏条件:后面一个点不能跑到前面这个点的前面去

  spfa(0); 
  spfa(1); 
  if(dis[n] == maxn_tmp || !in[n]) printf("-2\n");
  else cout << dis[n] << endl; 
  return 0;
}

标签:le,int,差分,vis,read,补坑,模板,dis
From: https://www.cnblogs.com/wondering-world/p/16771637.html

相关文章

  • P3388 【模板】割点(割顶)
    【模板】割点(割顶)题目背景割点题目描述给出一个\(n\)个点,\(m\)条边的无向图,求图的割点。输入格式第一行输入两个正整数\(n,m\)。下面\(m\)行每行输入两个正整......
  • 模板引擎
    1、模板引擎的步骤1.1语法通过{{}}进行变量的输出:三元、对象属性、数组、表达式等点击查看代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UT......
  • idea -- mybaties -- 模板下载
    1,ctroller-->如下@GetMapping(value="/createTlzExcel")publicStringcreateTlzExcel(HttpServletResponseresponse)throwsException{Map<String,Object>exc......
  • vue-2 模板语法
    router/index.js//1、引入基础依赖importVuefrom'vue'importRouterfrom'vue-router'//2、引入要路由的页面importSmartyfrom"../components/smarty"//3、......
  • Luogu P3389【模板】高斯消元法
    题意给定一个线性方程组,对其求解。$1\leqn\leq100,\left|a_i\right|\leq{10}^4,\left|b\right|\leq{10}^4$题解因为之前贺题解的时候没有理解高斯-约......
  • 29 自定义模板功能
    在相应的app文件夹中,创建templatetags文件夹,必须是templatetags文件夹命名:注意:templatetags文件夹中必须要有__init__.py文件jd.py:fromdjangoimporttemplateregist......
  • DW个人网站制作成品 简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码
    ......
  • 快速排序模板及快速选择例题
    快速排序模板及快速选择例题快速排序思路首先选择出分界值,x=q[l]或q[r]或q[(l+r)/2];将整个数组分为左右两段,使得左边的所有数都<=x,右边的所有数都>=x2.......
  • LuoguP3377 【模板】左偏树(可并堆)
    题意如题,一开始有\(n\)个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:1xy:将第\(x\)个数和第\(y\)个数所在的小根堆合并(若第\(x\)或第\(y\)个......
  • datax Steam模板
    ./datax.py-rstreamreader-wstreamwriter仅限于Steam方式{"job":{"content":[{"reader":{......