CCF 2017-03-4 地铁修建

本文介绍了一种基于最短路径算法的变形应用,通过修改传统的距离定义,寻找从起点到终点所有可能路径中,每条路径最大花费时间的最小值。使用SPFA算法实现,并附带完整代码。

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

大致思路:

最短路变形,建立dis数组。不过dis[i]保存的不是到达i点的最短路径,而是能到达i点的所有路径中每条路径中最长的天数最小值。(有点绕脑,就像样例说明一样,1到6有两条路径,其中一条路径要花6天完成(完成这条路的时间肯定是修这条路径的所有隧道花费时间最长的),另一条要7天,那么答案就是6天。)

所以当用spfa进行点松弛时,有:dis[to]=max(dis[top],cost)

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
#include<vector>
#include<queue>
#define inf 99999999
using namespace std;
int dis[200005];
int vis[200005];

struct Lu
{
    int to;
    int cost;
    Lu(int too,int costt)
    {
        to=too;
        cost=costt;
    }

};
vector<Lu>V[200005];
int spfa(int n)
{
    for(int i=0; i<=200005; i++)
    {
        vis[i]=0;
        dis[i]=inf;
    }
    dis[1]=0;
    queue<int>Q;
    Q.push(1);
    vis[1]=1;
    while(!Q.empty())
    {
        int top=Q.front();
        Q.pop();
        vis[top]=0;
        for(int i=0; i<V[top].size(); i++)
        {
            int to=V[top][i].to;

            int cost=V[top][i].cost;
            if(dis[to]>max(dis[top],cost))
            {

                dis[to]=max(dis[top],cost);
                if(!vis[to])
                {
                    Q.push(to);
                    vis[to]=1;
                }
            }

        }

    }

    return dis[n];
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0; i<=200005; i++)
        {
            V[i].clear();
        }
        int a,b,c;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            V[a].push_back(Lu(b,c));
            V[b].push_back(Lu(a,c));
        }
        printf("%d\n",spfa(n));
    }
}



### CCF CSP 第35次考试的真题及解答 目前关于CCF CSP第35次考试的具体题目和官方解答尚未被公开提及于所提供的参考资料中[^1]。然而,可以确认的是,在以往的CSP认证考试中,通常会涉及算法设计、数据结构应用以及编程实现能力等多个方面的考察。 对于类似的竞赛准备,建议参考过往试题及其解析来熟悉考试形式与难度水平。例如,“2018年3月CCFCSP认证”的部分试题已被整理并提供了解答指南,包括但不限于以下几个方面: - **跳一跳**:此题主要考查基本逻辑运算能力和简单的循环控制技巧。 - **碰撞的小球**:该类动态模拟问题需要考生具备较强的物理模型抽象思维,并能通过程序代码精确描述物体运动规律。 - **URL映射**:涉及到字符串处理技术的应用场景分析,要求能够高效匹配特定模式下的路径请求。 以下是基于已有资料的一个简单示例展示如何构建基础框架用于解决可能遇到的相关类型挑战——以“地铁修建”为例说明图论最短路径计算方法之一Dijkstra算法的实际运用情况: ```python import heapq def dijkstra(n, edges, start): graph = [[] for _ in range(n + 1)] # 构建邻接表表示加权无向图 for u, v, w in edges: graph[u].append((v, w)) graph[v].append((u, w)) dist = [float('inf')] * (n + 1) visited = [False] * (n + 1) pq = [(0, start)] # 初始优先队列包含起点距离为零的信息元组(当前顶点到源节点的距离估计值, 当前顶点ID) dist[start] = 0 while pq: d_u, u = heapq.heappop(pq) if not visited[u]: visited[u] = True for neighbor_v, weight_uv in graph[u]: alt_d = d_u + weight_uv if alt_d < dist[neighbor_v]: dist[neighbor_v] = alt_d heapq.heappush(pq, (alt_d, neighbor_v)) return dist # 测试用例输入参数定义如下: nodes_count = 6 edges_list = [ (1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9) ] start_node = 1 result_distances = dijkstra(nodes_count, edges_list, start_node) print(result_distances) # 输出各站点至起始站之间的最小花费时间列表 ``` 上述代码片段实现了单源最短路徑問題解決方案的一部分功能演示[^2]。尽管它并非直接针对您所询问的确切考題內容,但它展示了處理圖形數據結構時常用的技術手段。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值