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[+ ...
随机推荐
- maven工程pom.xml报Missing artifact net.sf.jasperreports:jasperreports:jar:6.2.0
有时maven工程的pom.xml报以下类型错误: Description Resource Path Location TypeMissing artifact net.sf.jasperrepor ...
- 数据结构&字符串:字典树
前缀树里面可以存一堆字符串,也可以说是一堆单词,存完之后我们可以轻松判断一个指定的字符串是否出现过 下面我来详细解释一下实现细节 *+; //单词个数*每一个单词的字符数 ; struct Trie ...
- Gradle加载本地jar包
有时,我们需要的jar包不一定能在远程仓库中找到,这时我们需要加载本地的jar包. 加载单独的jar包 在项目底下添加libs目录,将jar包仍进libs目录 build.gradle配置如下: de ...
- 【51NOD-0】1018 排序
[算法]排序 #include<cstdio> #include<algorithm> using namespace std; ]; int main() { scanf(& ...
- AndroidStudio获得发布版安全码SHA1
耗了一下午才搞定 在cmd中: 1.打开keytool的目录:即JDK的安装目录 2.输入口令: (E:\tenyears\tenyears\app是keystore文件的目录)
- 20179205《Linux内核原理与分析》第一周作业
输出 shiyanlou 图形字符的命令banner: 新建用户wangyazhe,输入密码不会显示出来: 利用sudo adduser添加一个用户 loutest,mkdir创建一个新的文件夹opt ...
- ShellCode的几种调用方法
ShellCode是一种漏洞代码,中文名也叫填充数据,一般是用C语言或者汇编编写.在研究的过程中,自己也学到了一些东西,发现其中也有许多坑,所以贴出来,如果大家有碰到的,可以参考一下. 以启动电脑上的 ...
- Intel call指令
转载:http://blog.ftofficer.com/2010/04/n-forms-of-call-instructions/ 最近有一个需求,给你个地址,看看这个地址前面是不是一个CALL指令 ...
- 如何在datepicker滚动完毕后触发事件去获得日期
本来以为这件事情应该需要借助datepicker的委托来处理的,但是并没有找到此空间的委托. 其实最最简单的做法就是在IB中将次控件connect到一个Action上. 经过测试,当datepicke ...
- 3.22. grep sed re
1.整理正则表达式博客 re http://www.cnblogs.com/oyoui/p/6599846.html 2.grep(正则表达式及字符处理) 1.显示出所有含有root的行: [roo ...