思路是差分约束+dfs版SPFA。

首先来思考差分约束的过程,将题目给出的式子进行转化:

  • 农场a比农场b至少多种植了c个单位的作物,

SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d[b]>d[a]-c)d[b]=d[a]-c,即让b<=a-c。

所以建一条a->b权值为-c的边,使d[b]始终满足<=d[a]-c。

  • 农场a比农场b至多多种植了c个单位的作物,

同理,建一条b->a,权值为c的边。

  • 农场a与农场b种植的作物数一样多。

建一条a,b间的双向边,权值为0。即建两条单向权值为0的边。

最后处理完所有条件,考虑存在整张图不连通的情况——这时候我们需要一个点能把整张图串起来,又不会影响到结果,即“超级源点”0点。

由0点向每个点建一条权值为0的边。

然后就是SPFA松弛,判负环的过程。这里用dfs版的SPFA不然会T。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,d[],vis[],cnt[],flag;
int ver[],Next[],edge[],head[],tot;
queue<int>q;
void add(int a,int b,int c){
ver[++tot]=b;
Next[tot]=head[a];
edge[tot]=c;
head[a]=tot;
}
int spfa(int x){
vis[x]=;
for(int i=head[x];i;i=Next[i]){
int v=ver[i],z=edge[i];
if(d[v]>d[x]+z){
d[v]=d[x]+z;
if(vis[v])return ;
if(!spfa(v))return ;
}
}
vis[x]=;
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,k,a,b,c;i<=m;i++){
scanf("%d",&k);
if(k==){
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
if(k==){
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
}
if(k==){
scanf("%d%d",&a,&b);
add(a,b,);
add(b,a,);
}
}
for(int i=;i<=n;i++)add(,i,);
memset(d,0x3f,sizeof(d));
d[]=;
if(!spfa())printf("No");
else printf("Yes");
return ;
}

洛谷P1993 小K的农场的更多相关文章

  1. 洛谷 P1993 小K的农场 解题报告

    P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...

  2. 洛谷 P1993 小K的农场

    P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...

  3. 洛谷P1993 小K的农场 [差分约束系统]

    题目传送门 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...

  4. 洛谷P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  5. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  6. 洛谷P1993 小 K 的农场(查分约束)

    /* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...

  7. 洛谷 P1993 小K的农场 题解

    每日一题 day55 打卡 Analysis 这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分 首先转化题目: 1:表示农场 a 比农场 b 至少多种植了 c 个单 ...

  8. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

  9. 洛谷P1993 小K的农场_差分约束_dfs跑SPFA

    Code: #include<cstdio> #include<queue> using namespace std; const int N=10000+233; const ...

随机推荐

  1. git遇到error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed failed怎么办?

    答: 将clone地址中的https://替换成git://即可解决 如: 将https://git.openwrt.org/project/luci.git修改为git://git.openwrt. ...

  2. HTML 转 PDF的两种实现方式

    itextsharp:不怎么兼容html原代码,特别是div的布局.但是能更灵活的创建原生pdf代码 wkhtmltopdf:基本可以不用写代码,直接将html文件生成pdf 文件存放在自己的百度云盘 ...

  3. 论文阅读: Siam FC

    一.研究动机 一方面传统算法设计的跟踪模型过于简单,另一方面深度学习方法很难达到实时效果然而现实场景中的应用对速度要求较高. "shallow method"(HCFT)没有很好地 ...

  4. 动态生成具有嵌套属性的linq选择(select)

    class SelectItem { public string Item { get; set; } } class SelectList { public int ID { get; set; } ...

  5. python程序—封装案例

    需求: 1.房子有户型.总面积.家具名称列表 房子没有任何家具 2.家具有名字和占地面积,其中 席梦思(bed):4平米 衣柜(chest): 2平米 餐桌(table): 1.5平米 3.将以上3个 ...

  6. tomcat中显示本地图片①(未解决)

    <本模块文仅作为学习过程中的自我总结,有需要可参看,欢迎指导与提出建议,很多地方可能断章取义,理解不到位,虚心求学.谢谢!> 资料查阅原因:2018/7/10(做项目中显示详情页面,从数据 ...

  7. js 变量作用域

    例子 <script> var a = "heh" function findLove(){ console.log(a); function findforyou() ...

  8. 修改Ubuntu锁屏快捷键

    修改为Win + L. 避免与Phpstorm中的代码格式化冲突.

  9. lua --- 表操作

    c api 参考手册:http://www.leeon.me/a/lua-c-api-manual // LuaTest.cpp : 定义控制台应用程序的入口点. // #include " ...

  10. Oracle高级查询之over(partition by...)

    现有表,数据如下: eg1:查询年龄第二的队员 通常写法: select * from (select a.*, rownum r from (select t.* from l_student_in ...