ZOJ 2526 FatMouse and JavaBean II 单源最短路 dijkstra

ZHO宣布博客搬家,并分享了解决最短路径问题的Dijkstra算法实现,包括时间复杂度、空间复杂度分析及AC代码。

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

ZOJ 2526 FatMouse and JavaBean II

博客搬新家,以后就是基本只在自己的独立博客进行更新,欢迎访问。http://zihengoi.cn

题目描述:

  题目链接:ZOJ 2526 FatMouse and JavaBean II
  

题目大意:

  给一个起点和终点。再给一些图中点的关系路。从起点到终点的最短路径有多少条。如果存在多条最短路,则求能得到 javabean 最多的一条路,输出得到 javabean 的数量,并输出该条路的路径。
  

解题思路:

  用 Dijkstra 记录最短路径。如果出现相同的最短路则更新路的条数,并在 javabean 多的时候更新状态并记录下路径即可。
  

复杂度分析:

时间复杂度 : O(n2)
空间复杂度 : O(n)

AC代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;

const int maxn = 510;
const int INF = 0x3fffffff;

struct Edge{
    int from,to,dist;
};

struct Heapnode{
    int d,u;
    bool operator < (const Heapnode& rhs) const{
        return d > rhs.d;
    }
};

bool done[maxn];
vector<Edge> edges;
vector<int> G[maxn];
int n,m,m1,rm1,rm2;
int jb[maxn], sumjb[maxn], d[maxn], p[maxn],ans[maxn],path[maxn];

void dijkstra(int s){
    priority_queue<Heapnode>Q;
    for(int i = 0; i < n; i++){
        d[i] = INF;
        sumjb[i] = 0;
        ans[i] = 1;
    }
    memset(done,false,sizeof(done));
    for(int i = 0; i < m1; i++) p[i] = s;
    d[s] = 0;
    sumjb[s] = jb[s];
    Q.push((Heapnode){0,s});
    while(!Q.empty())
    {
        Heapnode x = Q.top();
        Q.pop();
        int u = x.u;
        if(done[u]) continue;
        done[u] = true;
        for(int i = 0; i < G[u].size(); i++)
        {
            Edge& e = edges[G[u][i]];
            if(d[e.to] > d[u] + e.dist)
            {
                d[e.to] = d[u] + e.dist;
                sumjb[e.to] = sumjb[u] + jb[e.to];
                ans[e.to] = ans[u];
                p[e.to] = G[u][i];
                Q.push((Heapnode){d[e.to],e.to});
            }
            else if(d[e.to] == d[u] + e.dist){
                ans[e.to] += ans[u];
                if(sumjb[e.to] < sumjb[u] + jb[e.to]){
                    sumjb[e.to] = sumjb[u] + jb[e.to];
                    p[e.to] = G[u][i];
                    Q.push((Heapnode){d[e.to],e.to});
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d%d%d%d",&n,&m,&rm1,&rm2) != EOF){
        int from,to,dist;
        for(int i = 0; i < n; i++) G[i].clear();
        edges.clear();
        m1 = 0;
        for(int i = 0; i < n; i++) scanf("%d",&jb[i]);
        for(int i = 0; i < m; i++){
            scanf("%d%d%d",&from,&to,&dist);
            edges.push_back((Edge){from,to,dist});
            G[from].push_back(m1++);
            edges.push_back((Edge){to,from,dist});
            G[to].push_back(m1++);
        }
        dijkstra(rm1);
        printf("%d %d\n",ans[rm2],sumjb[rm2]);
        m1 = 1,path[0] = rm2;
        while(rm1 != rm2){
            path[m1++] = edges[p[rm2]].from;
            rm2 = edges[p[rm2]].from;
        }
        for(int i = m1-1; i > 0; i--)printf("%d ",path[i]);
        printf("%d\n",path[0]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值