题目链接:https://www.luogu.org/problemnew/show/P1993

1.差分约束:

对于a - b <= c 有一条 b——>a 权值为c

对于a - b >= c 有一条 a——>b 权值为-c

对于一个差分约束系统,若存在负环则无解

2.dfs版SPFA判负环

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ri register
using namespace std;
const int maxn = 100000 + 10;
const int inf = 0x7fffffff;
int n, m, dis[maxn], vis[maxn];
queue<int> q;
struct edge{
int from, to, next, len;
}e[maxn<<2];
int head[maxn], cnt;
void add(int u, int v, int w)
{
e[++cnt].from = u;
e[cnt].len = w;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
bool SPFA(int now)
{
vis[now] = 1;
for(int i = head[now]; i != -1; i = e[i].next)
{
if(dis[e[i].to] > dis[now] + e[i].len)
{
dis[e[i].to] = dis[now] + e[i].len;
if(!vis[e[i].to])
{
if(!SPFA(e[i].to)) return 0;
}
else return 0;
}
}
vis[now] = 0;
return 1;
}
int main()
{
memset(head, -1, sizeof(head));
scanf("%d%d",&n,&m);
for(ri int i = 1; i <= n; i++)
{
add(0, i, 0);dis[i] = inf;
}
for(ri int i = 1; i <= m; i++)
{
int u, v, w, opt;
scanf("%d",&opt);
if(opt == 1)
{
scanf("%d%d%d",&u,&v,&w);
add(u, v, -w);
}
if(opt == 2)
{
scanf("%d%d%d",&u,&v,&w);
add(v, u, w);
}
if(opt == 3)
{
scanf("%d%d",&u,&v);
add(v, u, 0);
add(u, v, 0);
}
}
if(!SPFA(0))
printf("No\n");
else
printf("Yes\n");
return 0;
}

最新文章

  1. windows上如何搭建Git Server
  2. ASP.NET SignalR
  3. SQL取行最大值
  4. urllib库初体验以及中文编码问题的探讨
  5. 【Spark学习】Apache Spark作业调度机制
  6. 三种方式得到LayoutInflater
  7. 鼠标双击范围基于Win7
  8. Android手机音量的控制
  9. Exchange Server 2010/2013功能差异
  10. 绑定枚举到dropdownlist
  11. characterEncodingFilter作用
  12. Dom-创建标签
  13. python绘制图形(Turtle模块)
  14. Devexpress GridControl切换数据源
  15. (转)Maven仓库——私服介绍
  16. 20171126--handlerThread
  17. Gson 使用和原理
  18. CSS function--(来自网易)
  19. Unity Package Manager Error的解决方案
  20. Windows Phone 8, 添加Map控件

热门文章

  1. ElasticSearch mapping中字段属性总结
  2. win7远程登录
  3. 如何看linux是32位还是64位--转
  4. Java学习第十八天
  5. 深入理解JavaScript系列(34):设计模式之命令模式
  6. 深入理解JavaScript系列(30):设计模式之外观模式
  7. 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP
  8. python发送邮件(带附件)
  9. Java读写锁
  10. Git和GitHub在线学习资源整理(转)