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[+ ...
随机推荐
- Matlab 工具箱介绍
Toolbox工具箱 序号 工具箱 备注 数学.统计与优化 1 Symbolic Math Toolbox 符号数学工具箱 2 Partial Differential Euqation Toolbo ...
- 51Nod 1010 只包含因子2 3 5的数 | 预处理+二分
Input示例 5 1 8 13 35 77 Output示例 2 8 15 36 80 分析:将所有的只含有2 3 5因子的数打一个表保存在一个数组里,然后二分查找第一个>=数组里的数,输出 ...
- 【BZOJ4870】组合数问题 [矩阵乘法][DP]
组合数问题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行有四个整数 n ...
- 【51NOD-0】1089 最长回文子串 V2(Manacher算法)
[算法]回文树 #include<cstdio> #include<algorithm> #include<cstring> using namespace std ...
- 【Windows使用笔记】Windows日常使用软件
整理一些对于我来说日常使用的Windows软件. 排名不分先后,仅凭我想起来的顺序! 1 MadAppLauncher 这个对我来说非常需要了. 使用它可以快速启动日常常用的软件,非常快捷高效.一般来 ...
- EF添加ADO.NET实体模型处直接选择Oracle数据源
上一文介绍了如何下载Mysql for vs Tools来进行Mysql的ADO.NET实体模型数据源选择,今天将Oracle的测试了下.步骤如下: 1.在你项目Model层中nuget安装选中项 2 ...
- 2017多校第7场 HDU 6127 Hard challenge 极角排序,双指针
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意:平面直角坐标系上有n个整点,第i个点有一个点权val,坐标为(xi,yi),其中不存在任 ...
- 如何在苹果官网下载旧版本的Xcode
如何在苹果官网下载旧版本的Xcode 前段时间XcodeGhost事件让很多应用中招,不乏一些知名的互联网公司开发的应用.事件的起因是开发者使用了非官方的Xcode,这些Xcode带有xcodegho ...
- MACBOOK 总是断网怎么办
MACBOOK 连接 wifi 老是断网.焦躁不安 看图,二个方法,第一就搞定,
- HDU-1151
Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...