King 差分约束 判负环
给出n个不等式
给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki
当符号为gt代表‘>’,符号为lt代表‘<'
那么样例可以表示
1 2 gt 0
a1+a2+a3>0
2 2 lt 2
a2+a3+a4<2
求是否存在不等式使得ai+a(i+1)+a(i+2)+...+a(i+n)<ki或者是ai+a(i+1)+a(i+2)+...+a(i+n)>ki 成立
显然就是一个判断是否存在负环
差分约束中
如果存在负环 说明无解 不存在
如果断路 无限解
spfa
用spfa算法还需要设置一个超级源点n+1 和所有边相连 距离为0 这样整个图就连起来了 否则是破碎的图 跑不动
注意连超级源点边的顺序
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 1000+5 struct node
{
int to,nex,v;
}edge[N];
int pos=;
int head[N];
void add(int a,int b,int c)
{
edge[++pos].nex=head[a];
head[a]=pos;
edge[pos].v=c;
edge[pos].to=b;
}
int n,m;
int vis[N];
int dis[N];
int cnt[N];
bool spfa()
{
queue<int>q;
CLR(vis,);
CLR(dis,0x3f);
CLR(cnt,);
q.push(n+);
dis[n+]=;
vis[n+]=;
cnt[n+]=;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;
for(int i=head[u];i;i=edge[i].nex)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].v)
{
dis[v]=dis[u]+edge[i].v;
if(!vis[v])
{
cnt[v]++;
if(cnt[v]>n)return ;
q.push(v);
vis[v]=;
}
}
}
}
return ;
}
int main()
{
while(RI(n),n)
{
RI(m);
CLR(head,);
pos=;
string str;
int a,b,k;
while(m--)
{
RII(a,b);cin>>str;RI(k);
if(str=="gt")
add(a+b,a-,-k-);
else add(a-,a+b,k-);
}
rep(i,,n)
add(n+,i,);//这里ab顺序反了也会错
if(spfa())
printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}
return ;
}
bellman算法判环更加简单不易错
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
typedef long long LL;
const int INF = <<;
/*
s[a+b+1] - s[a] >c --> s[a] - s[a+b+1] < -c <= -c-1
s[a+b+1] - s[a] <c --> s[a+b+1] -s[a] < c <= c-1
不连通要我们求环
*/
struct Edge
{
int from,to,dist;
}es[+];
int dist[+];
bool bellman_ford(int n, int m)
{
//因为是求存不存在负权回路,那么只要初始化为0,更新n遍之后,如果还能再更新,那么就存在
for(int i=; i<=n; ++i)
dist[i] = ;
for(int i=; i<=n; ++i)//n+1个点,所以要更新n遍
{
for(int j=; j<m; ++j)
{
Edge &e = es[j];
//因为图是不连通的,所以如果置为INF的时候,不能在这里加这个条件
if(/*dist[e.from]!=INF &&*/ dist[e.to] > dist[e.from] + e.dist)
dist[e.to] = dist[e.from] + e.dist;
}
}
for(int j=; j<m; ++j)
{
Edge &e = es[j];
if(dist[e.to] > dist[e.from] + e.dist)
return false;
}
return true;
}
int main()
{ int n,m,a,b,c,i;
char str[];
while(scanf("%d",&n),n)
{
scanf("%d",&m);
for(i=; i<m; ++i)
{
scanf("%d%d%s%d",&a,&b,str,&c);
if(str[]=='g')
{
es[i].from = a + b + ;
es[i].to = a;
es[i].dist = -c - ;
}
else
{
es[i].from = a;
es[i].to = a + b +;
es[i].dist = c-;
}
}
bool ret = bellman_ford(n,m);
if(ret)
puts("lamentable kingdom");
else
puts("successful conspiracy");
}
return ;
}
King 差分约束 判负环的更多相关文章
- 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...
- Did Pong Lie? (差分系统 判负环)
Did Pong Lie? 时间限制: 5 Sec 内存限制: 128 MB提交: 68 解决: 15[提交][状态][讨论版] 题目描述 Doctor Pong has two arrays o ...
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
- POJ——1364King(差分约束SPFA判负环+前向星)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11946 Accepted: 4365 Description ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
- POJ 1364 King --差分约束第一题
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- Poj(3259),SPFA,判负环
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- UVA 11090 Going in Cycle!!(二分答案+判负环)
在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...
随机推荐
- 关于Mac 系统mysql 乱码问题
这是由于客户端和服务端的编码没有同一 首先我们先在终端连接mysql 连接方法 mysql -u 用户名 -p 即可 然后输入你的密码 这里就不多说了 然后我们输入 show variabl ...
- 2019秋招Java面经(未完待续)
2019秋招Java面经(凭记忆回忆, 可能不准) 随着我们从大三升到大四...秋招也开始了. 秋招进行的还比较顺利, 刚开始没几天, 我的秋招就结束了. 到现在我玩了差不多十多天了, 总想着总结一下 ...
- Spring Boot 2.x以后static下面的静态资源被拦截
今天创建一个新的Spring Boot项目,没注意到spring boot的版本,发现静态资源无法访问.百度一下发现好像是Spring Boot 2.0版本以后static目录不能直接访问. 接下来直 ...
- 暑假闲着没事第一弹:基于Django的长江大学教务处成绩查询系统
本篇文章涉及到的知识点有:Python爬虫,MySQL数据库,html/css/js基础,selenium和phantomjs基础,MVC设计模式,ORM(对象关系映射)框架,django框架(Pyt ...
- ASP.NET后台调用API方法
/// <summary> /// 调用API POST请求与获取结果 /// </summary> ///URL 与 JSON串 public static string H ...
- 安装pandas报错(AttributeError: 'module' object has no attribute 'main')
在pycharm中安装pandas出现报错:AttributeError: 'module' object has no attribute 'main', 刚开始以为是pip的版本太旧了,于是乎将其 ...
- .bat以管理员身份运行
原文地址:https://blog.csdn.net/stranger_hello/article/details/82257947 @echo off :获取管理员权限 %1 mshta vbscr ...
- 解决tcp粘包问题
目录 什么是粘包(演示粘包现象) 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地 ...
- docker基础命令汇总
搜索镜像 docker search 镜像名称 例如:docker search centos7 下载镜像 docker pull 镜像名称 例如:docker pull centos7 启动容器 d ...
- vue 图片地址错误处理
<img src="/logo.png" :onerror="defaultImg"> data() { return { defaultImg: ...