POJ - 3169 差分约束
题意:n头牛,按照编号从左到右排列,两头牛可能在一起,接着有一些关系表示第a头牛与第b头牛相隔最多与最少的距离,最后求出第一头牛与最后一头牛的最大距离是多少,如 果最大距离无限大则输出-2,如果关系不能保证则输出-1
题解:差分约束的入门题
差分约束就是如果dis[b]-dis[a]<=c转化为a到b建一条有向边权值为c,接着求最短路就得出了两点的最大距离(最短距离都保证了,那么长一些的也可以成立),注意没有 最短路就是可能性无限,有一个负权回路就是关系不能保证,但是这个题要注意隐含条件就是需要建立每头牛一定不在前一头牛的前面这些边
#include<cstdio>
#include<cstring>
const int inf=0x3f3f3f3f;
const int maxn=;
struct Edge
{
int u,v,val;
Edge(int u,int v,int val):u(u),v(v),val(val) {}
Edge() {}
};
struct Edge bellEdge[maxn];
int dis[maxn];
void bellman(int s,int n,int m)
{
for(int i=; i<=n; ++i)
{
dis[i]=inf;
}
dis[s]=;
int flag;
for(int i=; i<n; ++i)
{
flag=;
for(int j=; j<m; ++j)
{
if(dis[bellEdge[j].u]<inf&&dis[bellEdge[j].v]>dis[bellEdge[j].u]+bellEdge[j].val)
{
dis[bellEdge[j].v]=dis[bellEdge[j].u]+bellEdge[j].val;
flag=;
}
}
if(flag)//无法再次松弛
return;
}
if(!flag&&dis[n]<inf)//最后依然可以松弛就是存在负权回路
dis[n]=-;
}
int main()
{
int n,ml,md,m;
while(~scanf("%d %d %d",&n,&ml,&md))
{
m=;
int u,v,c;
for(int i=; i<ml; ++i) //使用差分约束建立边
{
scanf("%d %d %d",&u,&v,&c);
bellEdge[m++]=Edge(u,v,c);
}
for(int i=; i<md; ++i)
{
scanf("%d %d %d",&u,&v,&c);//dis[u]-dis[v]<=-c转换为v到u的一条边权值为-c
bellEdge[m++]=Edge(v,u,-c);
}
for(int i=; i<n; ++i)
{
bellEdge[m++]=Edge(i+,i,);
}
bellman(,n,m);
if(dis[n]==inf) //无限解
{
printf("-2\n");
}
else if(dis[n]==-) //负权回路无解
{
printf("-1\n");
}
else
{
printf("%d\n",dis[n]);
}
}
return ;
}
POJ - 3169 差分约束的更多相关文章
- poj Layout 差分约束+SPFA
题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...
- poj 3159(差分约束经典题)
题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...
- poj 1201 差分约束
http://www.cnblogs.com/wangfang20/p/3196858.html 题意: 求集合Z中至少要包含多少个元素才能是每个区间[ai,bi]中的元素与Z中的元素重合个数为ci. ...
- POJ 1201 差分约束+SPFA
思路: 差分约束,难在建图.(我是不会告诉你我刚学会SPFA的...) 把每个区间的ai–>bi连一条长度为ci的边. k–>k+1连一条长度为0的边. k+1–>k连一条长度为-1 ...
- POJ 1201 差分约束(集合最小元素个数)
题意: 给你一个集合,然后有如下输入,a ,b ,c表示在范围[a,b]里面有至少有c个元素,最后问你整个集合最少多少个元素. 思路: 和HDU1384一模一样,首先这个题目可 ...
- poj 1716 差分约束
水水的. 给几个不等式:dis[b]-dis[a]>=2; 0<=dis[i+1]-dis[i]<=1; #include<iostream> #include< ...
- poj 3159 差分约束
思路:班长的糖果要比snoopy的多.并且要用手写堆栈,且堆栈的大小要开到20000000. #include<iostream> #include<cstdio> #incl ...
- poj 1364 差分约束
思路:设dis[i]为从0点到第i点的序列总和.那么对于A B gt k 来讲意思是dis[B+A]-dis[A]>k; 对于A B lt k来讲就是dis[B+A]-dis[A]<k; ...
- poj 2983 差分约束
思路: 设dis[i]为标号为i的点到0号点的距离.对于P A B X,我们能得到等式dis[a]-dis[b]=x,那么可以化为两个不等式dis[a]-dis[b]>=x和dis[b]-dis ...
随机推荐
- ipconfig /flushdns
C:\Users\sas>ipconfig /flushdns Windows IP 配置 已成功刷新 DNS 解析缓存. C:\Users\sas>ipconfig --help 错误: ...
- activate mod_rewrite How To Set Up mod_rewrite for Apache on Ubuntu 14.04 Apache Rewrite url重定向功能的简单配置
https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-for-apache-on-ubuntu-14-0 ...
- echarts容器动态设置高度
测试提了bug,柱状图数据多的情况下,都叠到了一起,效果如下图. 要解决这个bug,首先想到的是让柱状图的容器自适应高度.于是,把原本div上写固定的高度去掉. <div id="my ...
- 100个常用的linux命令(转)
原文:http://blogread.cn/it/article/6368?f=wb 1,echo “aa” > test.txt 和 echo “bb” >> test.txt / ...
- dict文档
文档 class dict(object): """ dict() -> new empty dictionary 创建字典的方式有两种: 1.dic = {} 2 ...
- 可能引起「We Were Unable to Load Disqus」错误的一种情况分析
今天想往Octopress里加评论,之前看了网上的教程,应该是简单的事情,因为Octopress本来为你准备好了评论插件Disqus的代码,只需要去Disqus注册个帐号,然后在_config.yml ...
- retry 使用
retry是用来实现重试的 from retry import retry @retry(tries=5, delay=2) def do_something(): xxx do_something( ...
- Android Volley全然解析(四),带你从源代码的角度理解Volley
版权声明:本文出自郭霖的博客,转载必须注明出处. https://blog.csdn.net/sinyu890807/article/details/17656437 转载请注明出处:http://b ...
- lnmp1.4环境下thinkphp3.2配置pathinfo模式
1.打开php.ini 通常该文件在 /usr/local/php/etc/php.ini vi /usr/local/php/etc/php.ini 找到 cgi.fix_pathinfo,默认为0 ...
- PAT 1151 LCA in a Binary Tree[难][二叉树]
1151 LCA in a Binary Tree (30 分) The lowest common ancestor (LCA) of two nodes U and V in a tree is ...