zoukankan      html  css  js  c++  java
  • 差分约束系统

    如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统。

    http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html

    题目描述
    造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000)。由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T1,T2,…,Tn并不是很容易确定的(但这些起始时间都是非负整数,因为它们必须在整个工程开始后启动)。例如:挖掘完成后,紧接着就要打地基;但是混凝土浇筑完成后,却要等待一段时间再去掉模板。
    
    这种要求就可以用M(5≤m≤5000)个不等式表示,不等式形如Ti-Tj≤b代表i和j的起始时间必须满足的条件。每个不等式的右边都是一个常数b,这些常数可能不相同,但是它们都在区间(-100,100)内。
    
    你的任务就是写一个程序,给定像上面那样的不等式,找出一种可能的起始时间序列T1,T2,…,Tn,或者判断问题无解。对于有解的情况,要使最早进行的那个任务和整个工程的起始时间相同,也就是说,T1,T2,…,Tn中至少有一个为0。
    
    
    输入
     第一行是用空格隔开的两个正整数n和m,下面的m行每行有三个用空格隔开的整数i,j,b对应着不等式Ti-Tj≤b。
    
    输出
    如果有可行的方案,那么输出N行,每行都有一个非负整数且至少有一个为0,按顺序表示每个任务的起始时间。如果没有可行的方案,就输出信息“NO SOLUTION”。
    
    样例输入
    5 8
    1 2 0
    1 5 -1
    2 5 1
    3 1 5
    4 1 4
    4 3 -1
    5 3 -1
    5 4 -3
    
    样例输出
    0
    2
    5
    4
    1
    #include<bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    const int N=1e5+50;
    const int p=1e9+7;
    int n,m,cnt;
    int last[N],d[N],ini[N];
    struct orz{
        int v,s,nex;}e[N*5];
    bool vis[N];
    void add(int u,int v,int s)
    {
        cnt++;
        e[cnt].v=v;
        e[cnt].nex=last[u];
        last[u]=cnt;
        e[cnt].s=s;
    }
     
    bool spfa()
    {
        queue<int>q;
        for (int i=1;i<=n;i++) d[i]=inf;
        vis[0]=1; d[0]=0;
        q.push(0); ini[0]++;
        while (!q.empty())
        {
            int now=q.front(); q.pop();
            for (int i=last[now];i!=-1;i=e[i].nex)
            {
                int to=e[i].v;
                if (d[to]>d[now]+e[i].s)
                {
                    d[to]=d[now]+e[i].s;
                    if (!vis[to])
                    {
                        vis[to]=1; q.push(to);
                        ini[to]++;
                        if (ini[to]>n) return 0;
                    }
                }
            }
            vis[now]=0;
        }
        return 1;
    }
     
    int main()
    {
        memset(last,-1,sizeof(last));
        scanf("%d%d",&n,&m);
        int x,y,z;
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            add(y,x,z);
        }
        for (int i=1;i<=n;i++) add(0,i,0);
        if (spfa())
        {
            int mini=d[0];
            for (int i=1;i<=n;i++) mini=min(mini,d[i]);
            for (int i=1;i<=n;i++) printf("%d
    ",d[i]-mini);
        }
        else printf("NO SOLUTION
    ");
        return 0;
    }
     
    View Code
    
         
  • 相关阅读:
    下一个ajax异步请求被挂起问题
    借鉴别人的Oracle 11g安装和卸载图文教程
    Html5 实现网页截屏 页面生成图片(图文)
    Oracle修改字段类型方法小技巧
    基于轻量级ORM框架Dapper的扩展说明
    JavaScript+html5 canvas实现本地截图教程
    SkipList跳表基本原理
    Oracle日期查询:季度、月份、星期等时间信息
    设计模式之模板模式
    设计模式之解释器模式
  • 原文地址:https://www.cnblogs.com/tetew/p/9375978.html
Copyright © 2011-2022 走看看