差分约束

博客介绍了POJ两道题的解法。poj3159是n个人分糖果问题,可转化为最短路模型,建图后以1为起点、n为终点跑最短路。poj3169是n头牛距离问题,根据关系好与不好的信息建图,求1号牛和n号牛的最大距离,有不同输出情况。

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

 

poj3159

题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果

思路:对应最短路模型,在松弛完最短路后则变为  d[v] <= d[u] + w  ,转化为  d[v] - d[u] <= w,这个和上面的 B - A <= C 是相同的模式 , 因此建图的时候A和B连一条有向边 , 边权为C,以1为起点,n为终点跑一遍最短路即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int maxn=150010;
const int INF=0x3f3f3f3f;
int head[maxn];
bool vis[maxn];

int Q[maxn];//堆栈
int dist[maxn];

int n,m;
int a,b,c,tol;

struct Edge
{
    int to;
    int v;
    int next;
}edge[maxn];

void addedge(int a,int b,int v)
{
    edge[tol].to=b;
    edge[tol].v=v;
    edge[tol].next=head[a];
    head[a]=tol++;
}

void SPFA(int start,int n)
{
    int top=0;
    for(int v=1;v<=n;v++)
    {
        if(v==start)
        {
            Q[top++]=v;
            vis[v]=true;
            dist[v]=0;
        }
        else
        {
            vis[v]=false;
            dist[v]=INF;
        }
    }
    while(top!=0)
    {
        int u=Q[--top];
        vis[u]=false;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(dist[v]>dist[u]+edge[i].v)
            {
                dist[v]=dist[u]+edge[i].v;
                if(!vis[v])
                {
                    vis[v]=true;
                    Q[top++]=v;
                }
            }
        }
    }
}

int main()
{
    memset(head,-1,sizeof(head));

    scanf("%d%d",&n,&m);
    tol=0;
    while(m--)
    {
        scanf("%d%d%d",&a,&b,&c);
        addedge(a,b,c);
    }
    SPFA(1,n);
    printf("%d\n",dist[n]);
    return 0;
}

poj3169

一共有n头牛,有ml个关系好的牛的信息,有md个关系不好的牛的信息,对应输入的第一行的三个元素,接下来ml行,每行三个元素A,B,D,表示A牛和B牛相距不希望超过D,接下来md行,每行三个元素A,B,D表示A牛和B牛的相距至少要有D才行。求1号牛和n号牛的最大距离,如果距离无限大输出-2,如果无解输出-1。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int maxn=20020;
const int INF=0x3f3f3f3f;
int head[maxn];
bool vis[maxn];
int cnt[maxn];
int Q[maxn];//堆栈
int dist[maxn];

int n,m,ml;
int a,b,c,tol;

struct Edge
{
    int to;
    int v;
    int next;
}edge[maxn];

void addedge(int a,int b,int v)
{
    edge[tol].to=b;
    edge[tol].v=v;
    edge[tol].next=head[a];
    head[a]=tol++;
}

bool SPFA(int start,int n)
{
    int rear=0,frot=0;
    for(int v=1;v<=n;v++)
    {
        if(v==start)
        {
            Q[rear++]=v;
            vis[v]=true;
            cnt[v]=1;
            dist[v]=0;
        }
        else
        {
            vis[v]=false;
            dist[v]=INF;
            cnt[v]=0;
        }
    }
    while(rear!=frot)
    {
        int u=Q[frot++];
        vis[u]=false;
        if(frot>=maxn) frot=0;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(dist[v]>dist[u]+edge[i].v)
            {
                dist[v]=dist[u]+edge[i].v;
                if(!vis[v])
                {
                    vis[v]=true;
                    Q[rear++]=v;
                    if(rear>=maxn) rear=0;
                    if(++cnt[v]>n) return false;
                }
            }
        }
    }
    return true;
}

int main()
{
    memset(head,-1,sizeof(head));

    while(~scanf("%d%d%d",&n,&m,&ml))
    {
        tol=0;
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
             if(a>b)swap(a,b);
            addedge(a,b,c);
        }
        while(ml--)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(a<b) swap(a,b);
            addedge(a,b,-c);
        }
        if(!SPFA(1,n)) printf("-1\n");
        else if(dist[n]==INF) printf("-2\n");
        else printf("%d\n",dist[n]);
    }
    
    return 0;
}

 

转载于:https://www.cnblogs.com/Fy1999/p/9556186.html

内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值