团体程序设计天梯赛-练习集 - L3-011 直捣黄龙(30 分)

简介: 团体程序设计天梯赛-练习集 - L3-011 直捣黄龙(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:注意判断条件时的次序严格性的问题。

AC 代码

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=250;
unordered_map<string,int>id;
unordered_map<int,string>name;
intn,m;
intvis[maxn], path[maxn], pre[maxn], cst[maxn], num[maxn], cost[maxn], dis[maxn];
intg[maxn][maxn];
voiddijkstra(ints)
{
dis[s]=0, path[s]=1;
while(1)
    {
intmi=INF; s=-1;
for(inti=1;i<=n;i++)
if(!vis[i] &&mi>dis[i]) mi=dis[i], s=i;
if(s==-1) return;
vis[s]=1;
for(inti=1;i<=n;i++)
        {
if(!vis[i] &&mi+g[s][i]<dis[i])
            {
dis[i]=mi+g[s][i];
pre[i]=s;
num[i]=num[s]+1;
path[i]=path[s];
cst[i]=cst[s]+cost[i];
            }
elseif(!vis[i] &&mi+g[s][i]==dis[i])
            {
path[i]+=path[s];
if(num[s]+1>num[i])
                {
pre[i]=s;
num[i]=num[s]+1;
cst[i]=cst[s]+cost[i];
                }
elseif(num[s]+1==num[i])
                {
if(cst[i]<cst[s]+cost[i])
                    {
pre[i]=s;
cst[i]=cst[s]+cost[i];
                    }
                }
            }
//            else if(!vis[i] && mi+g[s][i]==dis[i] && num[s]+1==num[i]) // 不能并列,需要放到第二条里面//            {//                path[i]+=path[s];//                if(cst[i]<cst[s]+cost[i])//                {//                    pre[i]=s;//                    cst[i]=cst[s]+cost[i];//                }//            }        }
    }
}
intmain()
{
mem(pre,-1), mem(g,INF), mem(dis,INF);
intth=0,w,u,v;
strings,d,ts,us,vs;
scanf("%d%d",&n,&m);
cin>>s>>d;
id[s]=++th, name[th]=s;
for(inti=1;i<n;i++)
    {
cin>>ts>>w;
id[ts]=++th, name[th]=ts;
cost[th]=w;
    }
for(inti=0;i<m;i++)
    {
cin>>us>>vs>>w;
g[id[us]][id[vs]]=g[id[vs]][id[us]]=w;
    }
dijkstra(id[s]);
vector<int>vec;
inth=id[d];
while(h!=-1)
    {
vec.push_back(h);
h=pre[h];
    }
for(inti=vec.size()-1;i>=0;i--)
printf("%s%s",name[vec[i]].c_str(),i==0?"\n":"->");
printf("%d %d %d\n",path[id[d]],dis[id[d]],cst[id[d]]);
return0;
}
目录
相关文章
|
移动开发 算法 调度
【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)
贪心算法是一种非常常见的算法,它的简单和高效性使其在实际应用中被广泛使用。 贪心算法的核心思想是在每一步都采取当前状态下最优的选择,而不考虑未来可能产生的影响。虽然贪心算法不能保证总是得到最优解,但在很多情况下,它可以获得很好的结果。 本篇文章将介绍贪心算法的基本概念和一些经典应用,以及如何通过贪心算法来解决一些实际问题。希望通过本文的阅读,读者可以对贪心算法有更加深刻的理解,并能够在实际问题中应用贪心算法来得到更好的解决方案。 让我们暴打贪心算法吧!
6941 0
|
Web App开发 缓存 Linux
|
4月前
|
人工智能 运维 关系型数据库
Moltbot实战:MoltBot+RDS AI助手Skill管理RDS实例
本文介绍如何5分钟快速对接Moltbot与阿里云RDS AI助手,打造专属AI数据库运维管家。通过开源Skill实现自动化诊断、参数调优、索引优化等能力,解放DBA于凌晨救火,让重复运维交给AI,专注高价值架构设计。(239字)
Moltbot实战:MoltBot+RDS AI助手Skill管理RDS实例
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
720 10
|
人工智能 算法 自动驾驶
AI的伦理困境:我们是否准备好面对?
【10月更文挑战第40天】随着人工智能技术的飞速发展,它已经深入到我们生活的方方面面。然而,随之而来的伦理问题也日益凸显。本文将探讨AI技术中的一些伦理困境,包括数据隐私、算法偏见、自动化失业等,并提供一些可能的解决方案。我们将通过代码示例来展示如何在AI应用中实现这些解决方案。
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
1186 3
|
网络协议 大数据 网络架构
【TCP】确认应答、超时重传机制和TCP报头
【TCP】确认应答、超时重传机制和TCP报头
494 3
|
SQL 关系型数据库 MySQL
当并发insert on duplicate key update遇见死锁:更新丢失
数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无外乎不涉及数据库隔离等级、索引、以及innodb锁等相关原因。但是我这个案例我搜遍了全网也没能找到比较相似情况。于是我想尽可能的复现出这种情况,找出死锁的原因,找出可能出现的隐患。问题的背景:我们的数据库中的发生死锁的表是具有”多列组合构建的唯一索引“(不包含
21733 4
|
监控 Java
内存溢出与内存泄漏的区别
内存溢出与内存泄漏的区别
596 2
|
存储 算法 数据处理
字典在Python中的应用与实例
字典在Python中的应用与实例
509 1