L3-011 直捣黄龙 (30 分)

简介: L3-011 直捣黄龙 (30 分)

本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营。当这样的路径不唯一时,要求选择可以沿途解放最多城镇的路径。若这样的路径也不唯一,则选择可以有效杀伤最多敌军的路径。


输入格式:

输入第一行给出 2 个正整数 N(2 ≤ N ≤ 200,城镇总数)和 K(城镇间道路条数),以及己方大本营和敌方大本营的代号。随后 N-1 行,每行给出除了己方大本营外的一个城镇的代号和驻守的敌军数量,其间以空格分隔。再后面有 K 行,每行按格式城镇1 城镇2 距离给出两个城镇之间道路的长度。这里设每个城镇(包括双方大本营)的代号是由 3 个大写英文字母组成的字符串。


输出格式:

按照题目要求找到最合适的进攻路径(题目保证速度最快、解放最多、杀伤最强的路径是唯一的),并在第一行按照格式己方大本营->城镇1->...->敌方大本营输出。第二行顺序输出最快进攻路径的条数、最短进攻距离、歼敌总数,其间以 1 个空格分隔,行首尾不得有多余空格。


输入样例:

10 12 PAT DBY
DBY 100
PTA 20
PDS 90
PMS 40
TAP 50
ATP 200
LNN 80
LAO 30
LON 70
PAT PTA 10
PAT PMS 10
PAT ATP 20
PAT LNN 10
LNN LAO 10
LAO LON 10
LON DBY 10
PMS TAP 10
TAP DBY 10
DBY PDS 10
PDS PTA 10
DBY ATP 10


输出样例:

1. PAT->PTA->PDS->DBY
2. 3 30 210


 思路:因为城镇名字是字符串直接处理太复杂了,所以需要用哈希映射,然后就直接用dijkstra求出最短距离就行了

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#include <vector>
using namespace std;
const int N = 210,inf = 0X3f3f3f3f;
int n,k;
int g[N][N];  // 存城镇间的距离
int num[N];  // 存城镇中的敌军数量
int sum[N];  // 从起点到当前点所杀的敌军数量
int pre[N];  // 记录前一个城镇的节点
int cnt[N];  // 这条路径解放城镇的数量
int dist[N];  // 从起点到当前点的距离
int quick[N];  // 最快进攻路径的条数
bool st[N];  // 判断这点是否走过
unordered_map<string,int>p1;
unordered_map<int,string>p2;
string s1,s2;
void dijstra()
{
    memset(dist,inf,sizeof dist);
    dist[1] = 0;
    cnt[1] = 1;
    quick[1] = 1;
    for(int i=1;i<=n;i++)
    {
        int t = -1;
        for(int j=1;j<=n;j++)
            if(!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        st[t] = true;
        for(int j=1;j<=n;j++)
        {
            if(dist[j] > dist[t] + g[t][j])  // 找到最短距离
            {
                dist[j] = dist[t] + g[t][j];
                sum[j] = sum[t] + num[j];
                cnt[j] = cnt[t] + 1;
                pre[j] = t;
                quick[j] = quick[t];
            }
            else if(dist[j] == dist[t] + g[t][j])
            {
                quick[j] += quick[t];
                if(cnt[j] < cnt[t] + 1)  
                {
                    sum[j] = sum[t] + num[j];
                    cnt[j] = cnt[t] + 1;
                    pre[j] = t;
                }
                else if(cnt[j] == cnt[t] + 1)
                {
                    if(sum[j] < sum[t] + num[j])
                    {
                        sum[j] = sum[t] + num[j];
                        pre[j] = t;
                    }
                }
            }
        }
    }
}
int main()
{
    memset(g,inf,sizeof g);
    cin >> n >> k >> s1 >> s2;
    p1[s1] = 1,p2[1] = s1;
    for(int i=2;i<=n;i++)
    {
        string name;
        int x;
        cin >> name >> num[i];
        sum[i] = num[i];
        p1[name] = i,p2[i] = name;
    }
    while(k -- )
    {
        string x,y;
        int time;
        cin >> x >> y >> time;
        g[p1[x]][p1[y]] = g[p1[y]][p1[x]] = time;
    }
    dijstra();
    vector<string>roat;  // 存路径
    int f1 = p1[s1],f2 = p1[s2];
    while(f2 != f1)
    {
        roat.push_back(p2[f2]);
        f2 = pre[f2];
    }
    cout << s1;
    for(int i=roat.size()-1;i>=0;i--)
        cout << "->" << roat[i];
    cout << endl;
    cout << quick[p1[s2]] << ' ' << dist[p1[s2]] << ' ' << sum[p1[s2]];
    return 0;
}


目录
相关文章
|
资源调度 前端开发
postcss-px-to-viewport 屏幕适配方案
postcss-px-to-viewport 屏幕适配方案
|
JSON 前端开发 JavaScript
|
开发者 iOS开发
uniapp打包苹果应用到哪里去获取私钥证书和证书profile文件
ios的应用,分两种安装方式,一种是上架app store的安装方式,一种是上传到一些应用内测的平台,进行扫码安装。
595 4
|
Windows
windows系统 如何查看端口占用情况并关闭占用的进程?
windows系统 如何查看端口占用情况并关闭占用的进程?
1386 0
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 4: 跨境电商场景, 快速判断商标|品牌侵权
很多业务场景中需要判断商标侵权, 避免纠纷. 例如 电商的商品文字描述、图片描述中可能有侵权内容. 特别是跨境电商, 在一些国家侵权查处非常严厉. 注册公司名、产品名时可能侵权. 在写文章时, 文章的文字内容、视频内容、图片内容中的描述可能侵权. 例如postgresql是个商标, 如果你使用posthellogresql、postgresqlabc也可能算侵权. 以跨境电商为力, 为了避免侵权, 在发布内容时需要商品描述中出现的品牌名、产品名等是否与已有的商标库有相似. 对于跨境电商场景, 由于店铺和用户众多, 商品的修改、发布是比较高频的操作, 所以需要实现高性能的字符串相似匹配功能.
442 0
|
JavaScript 前端开发 测试技术
深入调研了微前端,还是iframe最香(二)
深入调研了微前端,还是iframe最香
1068 0
深入调研了微前端,还是iframe最香(二)
|
机器学习/深度学习 自然语言处理 机器人
智能客服:提高客户服务的创新技术
智能客服作为提高客户服务质量和效率的创新技术,正在不断改变商业和服务的方式。通过自然语言处理、机器学习和知识图谱等技术,智能客服能够为客户提供更好的服务体验,同时也为企业带来了更大的竞争优势。虽然智能客服在应用中还面临一些挑战,如情感分析和数据隐私,但随着技术的发展和完善,它将在未来持续发挥重要作用。
1086 1
|
机器学习/深度学习 安全 网络安全
花无涯带你走进黑客世界之黑客红客
自从开始在网上写文章发表作品《网络黑白》之后,每发出一篇文章,我都会守在电脑前面一条条地看读者的评论。是想给初学者带给入门的知识技术学习的精华,相比一些其他的杂乱无序的书籍更值得推荐。以飞龙 王忘杰 昌维 黑色镰刀 冰尘等著名“喷子”,并不认识这群人,也从未进行过反击,那些并没有意义,我这里说的意义就是希望我写的东西能够对大家有那么一点帮助,我觉得这就够了,我愿和大家共同进步仅此而已。
508 0
|
监控 Unix 测试技术
loadrunner入门教程(30) --场景监控
场景监控的一些参数的详解和基本设置
466 0
loadrunner入门教程(30) --场景监控

热门文章

最新文章