hdu 1142 A Walk Through the Forest

本文探讨了一种计算从起点到终点的最短路径变形路径数量的方法,通过使用Dijkstra算法预处理得到家到各点的最短路径,再结合深度优先搜索统计满足特定条件的路径条数。

最短路变形

题意:输入n和m表示图的顶点数和边数然后下面m行给出每条边的信息(无向图)。起点是办公室编号1,终点时家编号2。从1到2,问满足要求的路径条数。要求就是,该条路径经过A点到B点的话,那么经过B点到家的最短路径值要小于A点到家的最短路径值,关于这句话是什么意思,看下面的注释

 

还好是1A了这题,否则的话感觉要调试很久

//先以家为源点运行一次dij得到家到每个点的最短路(也就是每个点到家的最短路)
//那么从办公室到家的最短路(一条或多条)一定符合题目的要求,因为最短路本身有最优子结构的性质
//还有一些路径,不是办公室到家的最短路,但是它符合题目的要求
//例如办公室为O,家为H,从O到H的最短路中经过C,OC=2,CH=8,即OH=10
//而有另外的一个点B,B到H的最短路BH=5,但OB=6,其实B点并不属于最短路(若0经过B到H长度为11)
//但是BH=5<OH=10,符合题目的意思
//所以我们知道,答案一定大于等于OH最短路的条数
//统计路径的数目用DFS记忆化搜索实现
//c[i]表示i这个点到终点H的路径条数
//c[i]=c[x1]+c[x2]+c[x3]……c[xm],其中x点与i点相连,并且x点最短路值小于i点最短路值

//邻接表建图
//DIJ一遍
//DFS记忆化搜索统计路径数

#include <cstdio>
#include <cstring>
#define N 1050
#define M 2000050
#define INF 0x3f3f3f3f

struct edge
{ int u,v,w,next;}e[M];
int first[N];
int n,en;
int d[N];
bool used[N];
int c[N];

void dfs(int u)
{
    if(c[u]!=-1) return ;

    c[u]=0;
    for(int i=first[u]; i!=-1; i=e[i].next)
    {
        int v=e[i].v;
        if(d[v] < d[u])
        {
            dfs(v);
            c[u]+=c[v];
        }
    }
}

void solve(int s ,int t)
{
    memset(c,-1,sizeof(c));
    c[t]=1;
    dfs(s);
    printf("%d\n",c[s]);
}

void DIJ(int s)
{
    memset(d,0x3f,sizeof(d));
    memset(used,0,sizeof(used));
    d[s]=0;

    for(int nn=1; nn<n-1; nn++)
    {
        int min=INF,k=s;
        for(int i=1; i<=n; i++)
            if(d[i]<min && !used[i])
            { min=d[i]; k=i;}
        used[k]=1;

        for(int i=first[k]; i!=-1; i=e[i].next) //邻接表松弛
        {
            int v=e[i].v , w=e[i].w;
            if(w+d[k] < d[v]) d[v]=d[k]+w;
        }
    }
}

void add(int u ,int v ,int w)
{
    e[en].u=u; e[en].v=v; e[en].w=w;
    e[en].next=first[u]; first[u]=en++;
}

void build()
{
    int m;
    memset(first,-1,sizeof(first));
    en=0;
    scanf("%d",&m);
    for(int i=1; i<=m; i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w); add(v,u,w);
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF && n)
    {
        build();
        DIJ(2);
        solve(1,2);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/scau20110726/archive/2013/02/19/2917261.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值