传送门

题目分析

差分约束 这里做个简单介绍:形如\(x_i - x_j >= d\)的不等式,可以联想到我们求最短路时\(d_v <= d_u + len\),则上式可以变形为\(x_i >= x_j + d\)即连一条j->i的长度为d的边并跑最长路,dis[i]则是满足条件的最小解(因为上面等式采用的>=号,所以求出的时最小解,同理当变形为\(x_j <= x_i - d\) 采用<= 时求出的是最大解)。

差分约束

这道题也是经典的差分约束,只是要注意几个问题:

  • spfa判负环 无解
  • 输入矛盾条件时直接无解

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; const int N = 1e6 + 5;
typedef long long ll;
const ll OO = 0x3f3f3f3f;
int times[N];
int n, k; ll dis[N];
int ecnt, adj[N], go[N << 2], nxt[N << 2], len[N << 2];
bool vst[N]; inline void addEdge(int u, int v, int l){
nxt[++ecnt] = adj[u], adj[u] = ecnt, go[ecnt] = v, len[ecnt] = l;
} inline int read(){
int i = 0, f = 1;char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') ch = getchar(), f = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar())
i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
} inline void wr(ll x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
} inline bool spfa(){
static int que[N], qn;
for(int i = 1; i <= n; i++) dis[i] = -OO;
dis[0] = 0;
que[qn = 1] = 0;
vst[0] = true;
for(int ql = 1; ql <= qn; ql++){
int u = que[ql];
vst[u] = false;
times[u]++;
if(times[u] == n) return false;
for(int e = adj[u]; e; e = nxt[e]){
int v = go[e];
if(dis[v] < dis[u] + len[e]){
dis[v] = dis[u] + len[e];
if(!vst[v]) vst[v] = true, que[++qn] = v;
}
}
}
return true;
} int main(){
n = read(), k = read();
for(int i = n; i >= 1; i--) addEdge(0, i, 1);
for(int i = 1; i <= k; i++){
int x = read(), a = read(), b = read();
switch(x){
case 1:{
if(a != b){
addEdge(a, b, 0);
addEdge(b, a, 0);
}
break;
}
case 2:{
if(a == b){
printf("-1");
return 0;
}
addEdge(a, b, 1);
break;
}
case 3:{
if(a != b)
addEdge(b, a, 0);
break;
}
case 4:{
if(a == b){
printf("-1");
return 0;
}
addEdge(b, a, 1);
break;
}
case 5:{
if(a != b)
addEdge(a, b, 0);
break;
}
default: break;
}
}
if(!spfa()){
printf("-1");
return 0;
}
ll ans = 0;
for(int i = 1; i <= n; i++){
ans += dis[i];
}
wr(ans);
return 0;
}

最新文章

  1. continue break 区别
  2. C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
  3. C# List 的一些操作 (两List元素是否想同,List是否包含在另一个List中)
  4. [转]JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
  5. 小tip:纯CSS让overflow:auto页面滚动条出现时不跳动
  6. Linux下串口编制【转】
  7. jsp调用java方法 function taglib
  8. PHP 面试题数组篇[ 整理中 ]
  9. HTML-移动端如何使用css让百分比布局的弹窗水平和垂直方向上居中
  10. UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明
  11. 数据库 mysql 优化器原理
  12. object c小代码——日期篇
  13. Top命令查看内存
  14. ORACLE EXP-00011:表不存在的分析和解决方案
  15. 从网络通信角度谈web性能优化
  16. ShadowBroker释放的NSA工具中Esteemaudit漏洞复现过程
  17. Mybatis之一级缓存,二级缓存
  18. mysql 2pc理解
  19. 【springboot】之将properties配置转为bean
  20. redis永久化存储

热门文章

  1. DriverModule_01
  2. 无法解决 React 启动的报错
  3. WebApp调用手机相册或摄像头、拨打电话
  4. Javascript和jquery事件-鼠标移入移出事件
  5. POJ 3264 Balanced Lineup 线段树RMQ
  6. 5.容器管理【Docker每天5分钟】
  7. linux安装anaconda
  8. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
  9. mysql 存相同内容:utb8mb4 会比 utf8 占用更多的内存吗,utf8mb4 浪费内存吗?utf8 utf8mb4 区别
  10. AE开发概念辨析