代码编织梦想

题目地址:POJ 3169

很简单的差分约束。。公式很明显。当输入最大值的时候,是a-b<=c,最小值的时候是a-b>=c。然后根据这个式子用最短路求。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
const int INF=0x3f3f3f3f;
int d[2000], head[2000], cnt, source, sink, aa[2000];
struct node
{
    int u, v, w, next;
} edge[1000000];
void add(int u, int v, int w)
{
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int berman(int n)
{
    //memset(vis,0,sizeof(vis));
    int i, j, flag;
    memset(d,INF,sizeof(d));
    d[1]=0;
    for(i=1;i<=n;i++)
    {
        flag=0;
        for(j=0;j<cnt;j++)
        {
            if(d[edge[j].v]>d[edge[j].u]+edge[j].w)
            {
                d[edge[j].v]=d[edge[j].u]+edge[j].w;
                flag=1;
            }
        }
        if(!flag)
            break;
    }
    for(i=0;i<cnt;i++)
    {
        if(d[edge[i].v]>d[edge[i].u]+edge[i].w)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int n, ml, md, a, b, c, i, j, x;
    scanf("%d%d%d",&n,&ml,&md);
    memset(head,-1,sizeof(head));
    cnt=0;
    while(ml--)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        //add(b,a,c);
    }
    while(md--)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(b,a,-c);
        //add(a,b,-c);
    }
    x=berman(n);
    if(!x)
        printf("-1\n");
    else
    {
        if(d[n]==INF)
            printf("-2\n");
        else
        printf("%d\n",d[n]);
    }
    return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/scf0920/article/details/38780203

poj 3169 layout 差分约束/bellman-ford-爱代码爱编程

POJ 3169 Layout 博客搬新家,以后就是基本只在自己的独立博客进行更新,欢迎访问。http://zihengoi.cn 题目链接:   题目链接:POJ 3169 Layout 题目大意:   

差分约束系统c++实现_iteye_9281的博客-爱代码爱编程

差分约束:线性规划矩阵A的每一行包含一个1与一个-1,其他元素为0.因此,由Ax<=b给出的约束条件是m个差分约束集合,其中包含n个未知元。每个约束条件为不等式: xj-xi<=bk 其中1<=i,j<=n,i<=k<=m 解决方法:把n个未知元看成n的有向图的顶点,xj-xi<=bk表示顶点j到顶点i

有限差分法C语言编程,有限差分法-爱代码爱编程

有限差分法(Finite Differential Method, FDM) [编辑] 什么是有限差分法 有限差分法是指用泰勒级数展开式将变量的导数写成变量,在不同时间或空间点值的差分形式的方法。 [编辑] 有限差分法的基本思想 按时间步长和空间步长将时间和空间区域剖分成若干网格,用未知函数在网格结(节)点上的值所构成的差分近似代替所用偏微

《图论:差分约束算法详解 + 算法证明》+ 模板题:糖果_wsh1931的博客-爱代码爱编程

差分约束: 一:求不等式组的可行解         源点需要满足的条件,从源点出发一定可以走到所有的边。(为何不是所有的点??因  为若存在点遍历不到,说明他不在所要求解的不等式中,换言之就是遍历不到的点可以          取任意实数) 步骤:         【1】:先将每个不等式x[i] <= x[j] + c[k] 转化为

poj 3159 candies(差分约束系统)-爱代码爱编程

题目地址:POJ 3159 第一发差分约束的题。。就当作最短路来做了。。。直接建图+spfa。。不过我用的spfa+slf优化都超时。。看了讨论区里的。。把spfa换成栈就过了。。。 代码如下: #include <iostream> #include <cstdio> #include <string> #in

poj 1201 && hdu 1384 intervals(差分约束系统)-爱代码爱编程

题目地址:POJ 1201   HDU 1384 根据题目意思,可以列出不等式如下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路spfa来解决这个不等式。用max来当源点,0为终点。最终的-d[0]就是答案。 代码如下: #include <iostream> #

poj 3169 layout (差分约束+bellman )-爱代码爱编程

题目链接:http://poj.org/problem?id=3169 题意:输入N, ML, MD, N默示有N个牛按1-N排成一排,ML,默示有ML行,每行输入A, B, D默示A牛和B牛最远间隔为D, MD默示有MD行,每行输入A,B,D默示A牛和B来间隔为D,求满足所有前提的1-N的最大间隔。 比较简单的差分约束,这个周周赛的A题