差分约束系统模板

差分约束系统:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如 xj - xi<= bk ( i , j ∈ [1,n],k ∈ [1,m]),则称其为差分约束系统。
例如如下的约束条件:
X1 - X2 <= 0
X1 - X5 <= -1
X2 - X5 <= 1
X3 - X1 <= 5
X4 - X1 <= 4
X4 - X3 <= -1
X5 - X3 <= -3
X5 - X4 <= -3

上述过程最终得到的解为满足差分约束系统各项的最大值。

注意点:
1. 如果要求最大值想办法把每个不等式变为标准 x - y <= k 的形式,然后建立一条从 y 到 x 权值为 k 的边,变得时候注意 x - y < k => x - y <= k-1。
2. 如果要求最小值的话,变为 x - y >= k 的标准形式,然后建立一条从 y到 x 权值为 k 的边,求出最长路径即可。
3. 如果权值为正,用Dijkstra,SPFA,BellmanFord都可以,如果为负不能用Dijkstra,并且需要判断是否有负环,有的话就不存在。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x7fffffff
using namespace std;
const int MAXN = 1100;
const int MAXM = 30030;

struct EdgeNode
{
    int to;
    int w;
    int next;
}Edges[MAXM];

int Head[MAXN],Dist[MAXN],vis[MAXN],outque[MAXN],id;

void AddEdges(int u,int v,int w)
{
    Edges[id].to = v;
    Edges[id].w = w;
    Edges[id].next = Head[u];
    Head[u] = id++;
}
void SPFA(int s,int N)
{
    int ans = 0;
    memset(vis,0,sizeof(vis));
    memset(outque,0,sizeof(outque));
    for(int i = 1; i <= N; ++i)
        Dist[i] = INF;
    Dist[s] = 0;
    vis[s] = 1;
    queue<int> Q;
    Q.push(s);
    while( !Q.empty() )
    {
        int u = Q.front();
        Q.pop();
        vis[u] = 0;
        outque[u]++;
        if(outque[u] > N+1) //如果出队次数大于N,则说明出现负环
        {
            ans = -1;
            break;
        }
        for(int i = Head[u]; i != -1; i = Edges[i].next)
        {
            int temp = Dist[u] + Edges[i].w;
            if(temp < Dist[Edges[i].to])
            {
                Dist[Edges[i].to] = temp;
                if( !vis[Edges[i].to])
                {
                    vis[Edges[i].to] = 1;
                    Q.push(Edges[i].to);
                }
            }
        }
    }

    if(ans == -1)   //出现负权回路,不存在可行解
        printf("-1\n");
    else if(Dist[N] == INF) //可取任意值,都满足差分约束系统
        printf("-2\n");
    else
        printf("%d\n",Dist[N]);  //求使得源点 s 到 终点 t 的最大的值
}

int main()
{
    int N,ML,MD,u,v,w;
    while(~scanf("%d%d%d", &N, &ML, &MD))
    {
        memset(Head,-1,sizeof(Head));
        id = 0;
        for(int i = 0; i < ML; ++i)
        {
            scanf("%d%d%d",&u,&v,&w);
            AddEdges(u,v,w);//建边 u - v <= w
        }
        for(int i = 0; i < MD; ++i)
        {
            scanf("%d%d%d",&u,&v,&w);
            AddEdges(v,u,-w);//建边 v - u <= w
        }
//这里不加也可以
//        for(int i = 1; i < N; ++i)
//            AddEdges(i+1,i,0);
        SPFA(1,N);  //求使得源点 s 到 终点 t 的最大的值
    }

    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 数据延时的要求设定以及多个时钟分区之间的相互作用描述。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值