【NEFU 1283】最短路

本文详细解析了在ACM竞赛中解决最短路径问题的算法实现,通过两次运行最短路径算法,分别计算从起点到各旅游点及从各旅游点返回起点的最短距离,适用于单向路径问题。

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1283

这道题很简单,就是跑两遍最短路,因为是单向路径,所以跑一遍最短路算出到各个要旅游的地方的最短距离,然后就要算各个旅游的地方到家的最短距离,这里要把原来的路线反过来再跑一遍最短路,答案就出来了

代码:

#include <map>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;

const int maxn=50005;

struct node
{
    int next,to,w;
}e[maxn];

queue<int>q;
int dis[maxn],vis[maxn];
int head[maxn],cnt;
int a[maxn],b[maxn],c[maxn],x[maxn];

void add(int u,int v,int w)
{
    e[++cnt].next=head[u];
    e[cnt].w=w;
    e[cnt].to=v;
    head[u]=cnt;
}

void spfa(int x)
{
    while(!q.empty())
    q.pop();
    dis[x]=0;
    q.push(x);
    vis[x]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i!=0;i=e[i].next)
        {
            node v=e[i];
            if(dis[v.to]>dis[u]+v.w)
            {
                dis[v.to]=dis[u]+v.w;
                if(!vis[v.to])
                {
                    q.push(v.to);
                    vis[v.to]=1;
                }
            }
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    for(int j=1;j<=t;j++)
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        memset(head,0,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
            add(a[i],b[i],c[i]);
        }
        for(int i=1;i<=n;i++)
        {
            dis[i]=INF;
        }
        spfa(1);
        long long ans=0;
        int flag=0;
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&x[i]);
            if(dis[x[i]]!=INF)
            {
                ans+=dis[x[i]];
            }
            else
            {
                flag=1;
            }
        }
        memset(head,0,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++)
        {
            add(b[i],a[i],c[i]);
        }
        for(int i=1;i<=n;i++)
        {
            dis[i]=INF;
        }
        spfa(1);
        for(int i=1;i<=k;i++)
        {
            if(dis[x[i]]!=INF)
            {
                ans+=dis[x[i]];
            }
            else
            {
                flag=1;
            }
        }
        if(flag==1)
        printf("Case #%d: QAQ\n",j);
        else
        printf("Case #%d: %lld\n",j,ans);
    }
    return 0;
}

 

### 关于东北林业大学 (NEFU) 数据库及相关项目的资料 #### 1. NEFU 的背景介绍 东北林业大学(Northeast Forestry University, NEFU)作为一所具有鲜明林科特色的高等院校,在信息技术领域也有一定的研究基础和发展方向。该校不仅注重传统林业科学的研究,还积极将现代技术应用于森林资源管理、生态环境保护等领域[^1]。 #### 2. NEFU 数据库相关实验与教学 在 NEFU 的计算机科学与技术学院以及信息管理等相关专业的课程设置中,数据库原理及其应用是一个重要的组成部分。例如,在《数据库系统》课程的教学过程中,学生会通过实际操作 SQL 查询语句来掌握数据检索技巧。具体到实验环节,可能会涉及如下内容: - **查询所有学生都选修的课程名称** 这一需求可以通过转换逻辑表达式实现。由于 SQL 中不存在直接支持全称量词的操作符,因此可以采用否定的方式将其转化为存在量词的形式。即 `(∀x)P(x)` 可以被改写为 `¬(∃x ¬P(x))`。基于此理论,下面提供了一个可能的解决方案: ```sql SELECT cname FROM course c WHERE NOT EXISTS ( SELECT * FROM student s WHERE NOT EXISTS ( SELECT * FROM sc WHERE sc.sid = s.sid AND sc.cid = c.cid ) ); ``` 此处假设表结构定义如下: - 学生表 (`student`):包含字段 `sid`(学号), `sname`(姓名); - 课程表 (`course`):包含字段 `cid`(课程编号),`cname`(课程名); - 成绩表 (`sc`):记录学生的选课情况,关联字段分别为 `sid`, `cid`. 以上代码片段展示了如何利用嵌套子查询完成复杂条件下的筛选任务[^2]。 #### 3. 实际案例分析 —— 林业信息化建设项目 针对 NEFU 特有的学科优势,其参与开发的一些典型项目包括但不限于以下几个方面: - **智慧林业管理系统**:该项目旨在构建一套完整的数字化平台用于监测森林生长状况、病虫害防治效果评估等方面的工作。它依赖强大的后台数据库存储海量地理空间数据,并借助 GIS 技术呈现直观的地图界面供决策者参考。 - **碳汇计量模型优化工具包**:为了响应全球气候变化议题,研究人员设计了一款专门用来估算特定区域内植被吸收二氧化碳能力的应用程序。该软件内部集成了复杂的算法计算过程,同时需要连接外部气象站点获取实时环境参数输入值以便提高预测精度。 这些实例充分体现了 NEFU 将专业知识融入 IT 解决方案的能力水平。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值