差分约束模板

本文介绍如何使用差分约束系统解决求最小值问题,通过将问题转换为图论中的最长路径问题,并提供了一个具体的POJ 1716题目示例及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

差分约束一般是用来求最大值最小值问题的

那么就分为两个问题

求最小值,把所有不等式化为>=然后求最长路


求最大值,把所有不等式化为<=然后求最短路


如果碰到<比如a+b<c 那么就可以转化为a+b<=c-1


然后就是单纯的图论题了


现在来看poj1716

Description

An integer interval [a,b], a < b, is a set of all consecutive integers beginning with a and ending with b. 
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.

Input

The first line of the input contains the number of intervals n, 1 <= n <= 10000. Each of the following n lines contains two integers a, b separated by a single space, 0 <= a < b <= 10000. They are the beginning and the end of an interval.

Output

Output the minimal number of elements in a set containing at least two different integers from each interval.

Sample Input

4
3 6
2 4
0 2
4 7

Sample Output

4

我们这道题是求最小值

可以写出这些不等式

a[en]-a[st-1]>=2

a[k+1]-a[k]<=1

a[k]-a[k+1]<=0

因为是求最小值,那么把不等式化为

a[en]-a[st-1]>=2

a[k]-a[k+1]>=-1

a[k+1]-a[k]>=0


然后放入spfa中求最长路即可

由于st的最小值是0,然后要用到st-1

所以我们这里用en+1,st来代替en,st-1

这里放上不知道能不能ac的代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <string.h>

using namespace std;

const int INF=0x3f3f3f3f;
const int maxm=511111;
const int maxn=111111;

struct EdgeNode
{
    int to;
    int w;
    int next;
};

EdgeNode edges[maxm];
int N,M;
int head[maxn],edge;
bool vis[maxn];
int cou[maxn];

queue <int> que;
int dis[maxn];

void addedge(int u,int v,int c)
{
    edges[edge].w=c,edges[edge].to=v,edges[edge].next=head[u],head[u]=edge++;
}

void init()
{
    memset(head,-1,sizeof(head));
    edge=0;
}

int spfa(int s,int n)//单源最短路(s为起点,n为节点总数)
{
    int u;
    for (int i=0; i<=n; i++)
        dis[i]=-INF;
    memset(vis,0,sizeof(vis));
    memset(cou,0,sizeof(cou));
    while (!que.empty())
        que.pop();
    que.push(s);
    vis[s]=true;
    dis[s]=0;
    while (!que.empty())
    {
        u=que.front();
        que.pop();
        vis[u]=false;
        for (int i=head[u]; i!=-1; i=edges[i].next)
        {
            int v=edges[i].to;
            int w=edges[i].w;
            if (dis[v]<dis[u]+w)//把这个符号改一下就可以求最短路了
            {
                dis[v]=dis[u]+w;
                if (!vis[v])
                {
                    vis[v]=true;
                    que.push(v);
                    cou[v]++;
                    if (cou[v]>n)//这里是判断负环的操作
                        return 0;
                }
            }
        }
    }
    if (dis[n]==INF)
        return 0;
    else
        return 1;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        init();

        int Max(0);

        for (int k=1;k<=n;k++)
        {
            int st,en;
            scanf("%d %d",&st,&en);
            addedge(st,en+1,2);
            Max=max(Max,en+1);
        }

        for (int k=0;k<=Max-1;k++)
            {addedge(k,k+1,0);addedge(k+1,k,-1);}

        spfa(0,Max);

        printf("%d\n",dis[Max]);
    }
    return 0;
}



### SRIO 差分时钟的约束方法 在设计中,SRIO(Serial RapidIO)差分时钟的约束对于确保信号完整性与时序收敛至关重要。以下是关于如何配置和约束 SRIO 差分时钟的设计指导。 #### 创建时钟对象 为了定义 SRIO 输入时钟,在 Vivado 中可以使用 `create_clock` 命令来指定时钟周期以及对应的端口名称。例如: ```tcl create_clock -period 8.333 -name srio_clk_in_p [get_ports srio_clk_in_p] ``` 上述命令会为名为 `srio_clk_in_p` 的端口创建一个具有 8.333 ns 周期的时钟对象[^2]。 #### 设置差分对关系 由于 SRIO 使用的是差分时钟信号,因此需要通过 `set_property DIFF_PAIR` 将正相与反相时钟关联起来。具体操作如下: ```tcl set_property DIFF_PAIR {srio_clk_in_n} [get_ports srio_clk_in_p] ``` 此命令明确了 `srio_clk_in_p` 和其对应负相端口 `srio_clk_in_n` 构成了一组差分对[^1]。 #### 定义时钟间的独立性 如果存在多路 SRIO 差分时钟,则需显式声明这些时钟之间互不相关联。可以通过以下 TCL 脚本来实现这一目标: ```tcl set_clock_groups -asynchronous \ -group [get_clocks clk_group_0] \ -group [get_clocks clk_group_1] \ -group [get_clocks clk_group_2] ``` 这里假设每一路 SRIO 时钟被分配到不同的时钟组 (`clk_group_x`) 并且它们彼此间不存在同步关系。 #### IP 核内部时序错误排查 当遇到 IP 核内部出现时序违例的情况时,可能的原因包括但不限于: - **未正确应用时钟约束**:确认所有的输入时钟均已按照实际硬件连接进行了精确建模。 - **过长的数据路径延迟**:检查数据通路上是否存在过多逻辑级数或者寄存器资源不足等问题。 - **跨时钟域传输问题**:验证是否有合适的手动插入 FIFO 或者同步电路用于解决异步通信带来的亚稳态风险。 针对以上情况可采取相应措施优化设计结构并调整综合选项参数直至满足最终产品规格书中的性能指标要求为止。 #### XDC 文件实例化模板 下面提供了一个完整的 `.xdc` 文件片段作为参考,展示了如何全面地施加 SRIO 差分时钟及时序方面的限制条件: ```tcl # Define differential clock pair create_clock -period 8.333 -name srio_clk_in_p [get_ports srio_clk_in_p] set_property DIFF_PAIR {srio_clk_in_n} [get_ports srio_clk_in_p] # Specify additional timing attributes if necessary set_input_delay -clock srio_clk_in_p 1.5 [get_ports data_in*] set_output_delay -clock srio_clk_in_p 1.5 [get_ports data_out*] # Declare asynchronous relationship among multiple clocks set_clock_groups -asynchronous \ -group [get_clocks clk_group_0] \ -group [get_clocks clk_group_1] \ -group [get_clocks clk_group_2] ``` 这段脚本不仅涵盖了基本的时钟建立过程,还包括了对外部 I/O 数据延时的要求设定以及多个时钟分区之间的相互作用描述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值