K短路-POJ2449

#include <queue>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>

using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
struct e{
    int to , next , w;
}edge[200005],f_edge[200005];
int n , m, s, e, k;
p_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
int vis[1005] , dis[1005], cnt1 = 0, cnt2 = 0, head1[1005], head2[1005];
struct node
{
    int v ;
    int cost;
    bool operator <(const node&another)const{
        return cost + dis[v] > another.cost + dis[another.v];
    }
    node(int a,int c):v(a),cost(c) {}
};
p_queue <node> aq;
void add1(int f, int t, int w)
{
    edge[cnt1].to = t;
    edge[cnt1].w = w;
    edge[cnt1].next = head1[f];
    head1[f] = cnt1 ++;
}
void add2(int f, int t, int w)
{
    f_edge[cnt2].to = t;
    f_edge[cnt2].w = w;
    f_edge[cnt2].next = head2[f];
    head2[f] = cnt2 ++;
}
void dijsktra()
{
    pair<int,int> pa;
    pa.first = 0;
    pa.second = e;
    dis[e] = 0;
    q.push(pa);
    while(!q.empty())
    {
        pair<int,int> no = q.top();
        q.pop();
        if(vis[no.second]) continue;
        vis[no.second] = 1;
        for(int i = head2[no.second] ; i != -1 ; i = f_edge[i].next)
        {
            int v = f_edge[i].to ,w = f_edge[i].w;
            if(dis[no.second] + w < dis[v] && !vis[v])
            {
                dis[v] = dis[no.second] + w;
                q.push(mk(dis[v],v));
            }
        }
    }
}
int Astar()
{
    aq.push(node(s,0));
    while(!aq.empty())
    {
        node no = aq.top();
        aq.pop();
        if(no.v == e)
        {
            k--;
            if(k == 0)
                return no.cost;
        }
        for(int i = head1[no.v] ; i != -1 ; i = edge[i].next)
            aq.push(node(edge[i].to,no.cost+edge[i].w));
    }
    return -1;
}
int main(void) {
    mem(dis,INF);
    mem(head1,-1);
    mem(head2,-1);
    mem(vis,0);
    scanf("%d %d",&n, &m);
    for(int i = 1 ; i <= m ; i ++)
    {
        int u ,v , w;
        scanf("%d %d %d",&u, &v, &w);
        add1(u,v,w);
        add2(v,u,w);
    }
    scanf("%d %d %d",&s, &e, &k);
    if(s == e)
        k ++;
    dijsktra(); //先求出所有点到终点的距离(反向建图,终点作为起点跑dij即可)
    printf("%d\n",Astar());//A*算法用于求出k短路
}

k短路求解步骤:

1.建立反向图,并求出任意点到终点的最短距离(dij算法)

2.利用A*进行搜索 启发式函数:

对于A*,估价函数=当前值+当前位置到终点的距离,即f(V)=g(V)+h(V),每次扩展估价函数值最小的一个;

对于K短路算法来说:

                                g(V)为当前从S到V所走的路径的长度(广搜变量记录);

                                h(V)为点V到的最短路的长度(第一步已经求出);

单向双向V2G 环境下分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)内容概要:本文介绍了在单向和双向V2G(Vehicle-to-Grid)环境下,分布式电源与电动汽车充电站的联合配置方法,并提供了基于Matlab的代码实现。研究涵盖电力系统优化、可再生能源接入、电动汽车充放电调度、储能配置及微电网经济调度等多个关键技术领域,重点探讨了在不同电价机制和需求响应策略下,如何通过智能优化算法实现充电站与分布式电源的协同规划与运行优化。文中还展示了多种应用场景,如有序充电调度、鲁棒优化模型、多标优化算法(如NSGA-II、粒子群算法)在电力系统中的实际应用,体现了较强的工程实践价值和技术综合性。; 适合人群:具备电力系统、新能源、智能优化算法等相关背景的科研人员、研究生及从事能源系统规划与优化的工程技术人员;熟悉Matlab/Simulink仿真工具者更佳。; 使用场景及标:①用于科研项中关于电动汽车与分布式电源协同配置的模型构与仿真验证;②支持毕业论文、期刊投稿中的案例分析与算法对比;③指导实际电力系统中充电站布局与能源调度的优化设计。; 阅读议:议结合文中提供的Matlab代码与具体案例进行同步实践,重点关注优化模型的数学模过程与算法实现细节,同时可参考文末网盘资源获取完整代码与数据集以提升学习效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值