团体程序设计天梯赛-练习集 - 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;
}
目录
相关文章
团体程序设计天梯赛-练习集L2篇⑨
团体程序设计天梯赛-练习集L2篇⑨
169 0
团体程序设计天梯赛-练习集L2篇⑦
团体程序设计天梯赛-练习集L2篇⑦
80 0
|
Perl
团体程序设计天梯赛-练习集L1篇③
团体程序设计天梯赛-练习集L1篇③
141 0
|
测试技术
团体程序设计天梯赛-练习集L2篇⑥
团体程序设计天梯赛-练习集L2篇⑥
118 0
|
人工智能 算法 安全
2022年 团体程序设计天梯赛——题解集(2)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-081 今天我要赢 (5分)——水题 本题题目链接!!!!! 2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。
326 0
|
Linux 测试技术 容器
2020年 团体程序设计天梯赛——题解集(1)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-065 嫑废话上代码 (5分) 本题题目链接!!!!! Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。
239 0
|
机器学习/深度学习
2018年 团体程序设计天梯赛——题解集
⭐L1-051 打折 (5分) 本题题目链接👈👈👈👈👈 去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。 输入格式: 输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。 输出格式: 在一行中输出商品的折扣价,保留小数点后 2 位。
553 0
|
存储 大数据
团体程序设计天梯赛(下)
团体程序设计天梯赛(下)
403 0
团体程序设计天梯赛(下)
|
算法 安全 定位技术
团体程序设计天梯赛(上)
团体程序设计天梯赛
450 0
团体程序设计天梯赛(上)
|
算法
团体程序设计天梯赛-模拟赛(下)
团体程序设计天梯赛-模拟赛(下)
495 0
团体程序设计天梯赛-模拟赛(下)