PAT L3-011. 直捣黄龙
最短路。
先求出一个只包含最短路的$DAG$,然后在$DAG$上$dp$一下就可以了。英文变数字还有$map$转一下。
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<queue>
#include<string>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std; int n,m,s,t,num[];
char tmp[],A[],B[]; map<string,int>xx;
map<int,string>yy; vector<int>G[],nG[];
int Time[][]; int disS[],disT[],f[]; int U[*],V[*],In[]; int ss[],pre[],sl[],dp[]; void spfaS()
{
memset(f,,sizeof f);
for(int i=;i<=n;i++) disS[i]=0x7FFFFFFF;
queue<int>Q; Q.push(s); f[s]=; disS[s]=; while(!Q.empty())
{
int h = Q.front(); Q.pop(); f[h]=;
for(int i=;i<G[h].size();i++)
{
int to = G[h][i];
if(disS[h]+Time[h][to]<disS[to])
{
disS[to] = disS[h]+Time[h][to];
if(f[to]==)
{
f[to]=;
Q.push(to);
}
}
}
}
} void spfaT()
{
memset(f,,sizeof f);
for(int i=;i<=n;i++) disT[i]=0x7FFFFFFF;
queue<int>Q; Q.push(t); f[t]=; disT[t]=; while(!Q.empty())
{
int h = Q.front(); Q.pop(); f[h]=;
for(int i=;i<G[h].size();i++)
{
int to = G[h][i];
if(disT[h]+Time[h][to]<disT[to])
{
disT[to] = disT[h]+Time[h][to];
if(f[to]==)
{
f[to]=;
Q.push(to);
}
}
}
}
} void W()
{
queue<int>Q; Q.push(s); dp[s]=; while(!Q.empty())
{
int h = Q.front(); Q.pop();
for(int i=;i<nG[h].size();i++)
{
int to = nG[h][i];
dp[to]+=dp[h];
if(sl[h]+>sl[to])
{
sl[to] = sl[h]+;
ss[to] = ss[h]+num[to];
pre[to]=h;
} else if(sl[h]+==sl[to])
{
if(ss[h]+num[to]>ss[to])
{
sl[to] = sl[h]+;
ss[to] = ss[h]+num[to];
pre[to]=h;
}
}
In[to]--;
if(In[to]==) Q.push(to);
}
}
} int main()
{
scanf("%d%d",&n,&m); scanf("%s%s",A,B); xx[A]=; yy[]=A;
for(int i=;i<=n;i++)
{
scanf("%s",tmp); xx[tmp]=i; yy[i]=tmp;
scanf("%d",&num[i]);
}
s=; t=xx[B]; for(int i=;i<=m;i++)
{
int P;
scanf("%s%s",A,B); scanf("%d",&P);
int u = xx[A], v = xx[B]; U[i] = u; V[i]=v;
Time[u][v]=Time[v][u]=P;
G[u].push_back(v);
G[v].push_back(u);
} spfaS(); spfaT(); for(int i=;i<=m;i++)
{
if(disS[U[i]]+disT[V[i]]+Time[U[i]][V[i]]==disS[t])
{
nG[U[i]].push_back(V[i]);
In[V[i]]++;
}
if(disS[V[i]]+disT[U[i]]+Time[U[i]][V[i]]==disS[t])
{
nG[V[i]].push_back(U[i]);
In[U[i]]++;
}
} W(); vector<int>Ans;
stack<int>St; int now=t;
while()
{
if(now==) break;
St.push(now);
now=pre[now];
} while(!St.empty())
{
Ans.push_back(St.top());
St.pop();
} for(int i=;i<Ans.size();i++)
{
cout<<yy[Ans[i]];
if(i<Ans.size()-) printf("->");
else printf("\n");
} printf("%d %d %d\n",dp[t],disS[t],ss[t]); return ;
}
PAT L3-011. 直捣黄龙的更多相关文章
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)
L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...
- pat 团体天梯 L3-011. 直捣黄龙
L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...
- PAT天梯赛L3-011 直捣黄龙
题目链接:点击打开链接 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求 ...
- PAT 01-1
#include <stdio.h> int main() { int i; int k; ]; scanf("%d", &k); ; i < k; i+ ...
- PAT 05-树8 Huffman Codes
以现在的生产力,是做不到一天一篇博客了.这题给我难得不行了,花了两天时间在PAT上还有测试点1没过,先写上吧.记录几个做题中的难点:1.本来比较WPL那块我是想用一个函数实现的,无奈我对传字符串数组无 ...
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
- PAT Judge
原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...
- PAT/字符串处理习题集(二)
B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...
随机推荐
- svg学习
百度百科: SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C制定的一种新的二维矢量图形格式,也 ...
- 上下文路径request.getContextPath();与${pageContext.request.contextPath}
(1) request.getContextPath();与${pageContext.request.contextPath}都是获取上下文路径: 1. request.getContextPath ...
- MSSQL Procudure Sample
代码: USE [Internal_Timesheet] GO /****** Object: StoredProcedure [dbo].[ManageTSReminder] Script Date ...
- [Luogu 2580] 于是他错误的点名开始了
[Luogu 2580] 于是他错误的点名开始了 不用好奇我为什么突然发水题题解- 突然觉得自己当年的幼儿园码风太幼稚,就试图把数据结构什么的用指针重写一遍- 想当年因为空间开太大而全 RE,调了一下 ...
- Java开源爬虫框架crawler4j
花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...
- PKUWC 2019 自闭记
PKUWC 2019 自闭记 Day -1 考前天天在隔壁的物竞教室划水(雀魂,能和吉老师一起玩的游戏都是好游戏),没有做题. Day 0 早上8:16的高铁,到广州南居然要6个小时...不知道福州和 ...
- YUV颜色编码解析(转)
原文转自 https://www.jianshu.com/p/a91502c00fb0
- Django rest framework 限制访问频率(源码分析)
基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...
- linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法
linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法 http://blog.csdn.net/w616589292/article/details/38274475 dos2unix ...
- 【软件设计】UML类图怎么看
前言 无论使用哪种语言,都离不开面向过程与面向对象两个流派,而类图是面向对象程序设计中至关重要的一种软件表达形式,如何看懂类图,并设计好的软件架构,是我们作为软件工程师必不可少的技能之一. 今天小黑把 ...