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[+ ...
随机推荐
- Win7 安装配置 nexus3.7.1
安装准备: nexus3.7.1 环境准备: maven.jdk 解压nexus目录结构为: E:\nexus-3.7.1-02 配置环境变量: 启动: nexus.exe /run
- 南阳ACM 题目275:队花的烦恼一 Java版
队花的烦恼一 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 ACM队的队花C小+经常抱怨:"C语言中的格式输出中有十六.十.八进制输出,然而却没有二进制输出, ...
- 【BZOJ】1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
[题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i] ...
- 【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国
[算法]线段树||树状数组&&并查集 [题解]修改必须暴力单点修改,然后利用标记区间查询. 优化:一个数经过不断开方很快就会变成1,所以维护区间最大值. 修改时访问到的子树最大值< ...
- 【BZOJ】2502 清理雪道
[算法]有源汇上下界最小流 [题解]上下界 初看以为是最小覆盖,发现边可以重复经过,不对. 要求所有边都经过……那就下界为1,上界为inf的可行流. 源汇……S连入度为0的点,T连出度为0的点?(反正 ...
- 洛谷 P3375 【模板】KMP字符串匹配
我这段时间因为字符串太差而被关了起来了(昨晚打cf不会处理字符串现场找大佬模板瞎搞,差点就凉了),所以决定好好补一下字符串的知识QAQ,暂时先学习kmp算法吧~ 题目链接:https://www.lu ...
- Vue 键盘事件
Vue2键盘事件:keydown/keyup... 1.使用 <!DOCTYPE html> <html> <head> <title></tit ...
- HDU 4757 可持久化trie树
首先如果给定一些数,询问这些数中哪个数^给定的数的值最大的话,我们可以建立一颗trie树,根连接的两条边分别为0,1,表示二进制下第15位,那么我们可以建立一颗trie树,每一条从根到叶子节点的链表示 ...
- 如何入门 Python 爬虫?
作者:谢科 来源:知乎链接:https://www.zhihu.com/question/20899988/answer/24923424 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- Python3 json、pickle序列化与反序列化
注意:可以dumps多次,loads只能一次,一般我们只dumps一次,loads一次,多个版本就写入多个文件 一.json序列化与反序列化: 支持各种语言数据交互,但只能处理字典,列表,集合等简单的 ...