PAT甲题题解-1003. Emergency (25)-最短路径+路径数目
给出n个城市,m条边,起始点c1和目的点c2
接下来给出n个城市的队伍数
以及m条双向边
问你求c1到c2的所有最短路径数目,以及其中经过的最多队伍数
先最短路dijkstra,同时建立vector数组pre存储前驱节点
然后dfs求出路径,以及每条路径经过的队伍数,更新最大值即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>
#define INF 0x3f3f3f
using namespace std;
const int maxn=;
int n,m,c1,c2;
int team[maxn];
struct Edge{
int to;
int w;
int next;
}edge[maxn*maxn];
int head[maxn];
int tot;
void add(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
void init(){
memset(head,-,sizeof(head));
tot=;
} struct Node{
int u;
int dis;
bool operator<(const Node tmp)const{
return dis>tmp.dis;
}
};
int dis[maxn];
int vis[maxn];
vector<int>pre[maxn];
void dijkstra(int s,int t){
for(int i=;i<maxn;i++){
dis[i]=INF;
pre[i].clear();
vis[maxn]=;
}
priority_queue<Node>q;
Node tmp;
tmp.u=s;
tmp.dis=dis[s]=;
q.push(tmp);
while(!q.empty()){
tmp=q.top();
q.pop();
vis[tmp.u]=;
int u=tmp.u;
if(u==t)
break;
for(int k=head[u];k!=-;k=edge[k].next){
int v=edge[k].to;
if(!vis[v]){
if(dis[u]+edge[k].w<dis[v]){
dis[v]=dis[u]+edge[k].w;
tmp.u=v;
tmp.dis=dis[v];
q.push(tmp);
pre[v].clear();
pre[v].push_back(u);
}
else if(dis[u]+edge[k].w==dis[v]){
/*
原先下面的没有注释掉,导致有样例错误。。。
这样会导致点v会在队列里出现两多次,也就取出多次
这样会出现重复的路径,影响最短路径数
*/
//tmp.u=v;
//tmp.dis=dis[v];
//q.push(tmp);
pre[v].push_back(u);
}
}
}
}
}
vector<int>path;
int maxsum=;
int cnt=;
void dfs(int u){
if(pre[u].size()==){
path.push_back(u);
cnt++;
int sum=;
for(int i=;i<path.size();i++){
int u=path[i];
sum+=team[u];
//printf("%d<-",u);
}
//printf("\n");
if(sum>maxsum){
maxsum=sum;
}
path.pop_back();
return;
}
path.push_back(u);
for(int i=;i<pre[u].size();i++){
dfs(pre[u][i]);
}
path.pop_back();
}
int main()
{
int u,v,w;
init();
scanf("%d %d %d %d",&n,&m,&c1,&c2);
for(int i=;i<n;i++){
scanf("%d",&team[i]);
}
for(int i=;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dijkstra(c1,c2);
dfs(c2);
printf("%d %d\n",cnt,maxsum);
return ;
}
PAT甲题题解-1003. Emergency (25)-最短路径+路径数目的更多相关文章
- PAT甲题题解-1010. Radix (25)-二分搜索
题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...
- PAT甲题题解-1032. Sharing (25)-链表水题
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了
这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...
- PAT甲题题解-1070. Mooncake (25)-排序,大水题
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT甲题题解-1078. Hashing (25)-hash散列
二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...
- PAT甲题题解-1006. Sign In and Sign Out (25)-找最小最大
判断哪个人最早到,哪个人最晚走水,就是找最大值最小值 #include <iostream> #include <cstdio> #include <algorithm& ...
- PAT甲题题解-1012. The Best Rank (25)-排序水题
排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...
- PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟
模拟先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站0 1 2 3 4 5 6 7 87.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 00 150 200 300 4 ...
- PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题
题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...
随机推荐
- vlanif和vlan路由
配置基于接口划分VLAN示例(接入层设备作为网关) 简介 划分VLAN的方式有:基于接口.基于MAC地址.基于IP子网.基于协议.基于策略(MAC地址.IP地址.接口).其中基于接口划分VLAN,是最 ...
- [python] 列表解析式的高效与简洁
方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...
- vue2.0路由切换后页面滚动位置不变BUG
最近项目中遇到这样一个问题,vue切换路由,页面到顶端的滚动距离仍会保持不变. 方法一: 监听路由 // app.vue export default { watch:{ '$route':func ...
- 10行代码爬取全国所有A股/港股/新三板上市公司信息
摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除了表格本身体现的内容以外,可能还想透过表格背后再挖掘些有意思或者有价值的信息.这时,可用python爬虫来实现.本文采用pandas库中的re ...
- linux 的常用命令---------第八阶段
raid 磁盘阵列-------raid 0 raid1 raid5 raid10 mdadm 命令常用参数 ...
- OpenCV——查找、绘制轮廓
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- POJ3468(线段树区间求和+区间查询)
https://vjudge.net/contest/66989#problem/C You have N integers, A1, A2, ... , AN. You need to deal w ...
- jqgrid 加入右键菜单按钮管理
除了在表格底部添加自定义按钮外,还可以通过设置右键菜单按钮来添加自定义事件.看下图: 如何实现以上功能? 1)引入ContextMenu插件 2)创建一个函数用于初始化右键菜单(本示例取名为 init ...
- jQuery的extend和fn.extend理解
参考网址:http://www.cnblogs.com/yuanyuan/archive/2011/02/23/1963287.html http://www.cnblogs.com/xuxiuyu/ ...
- 简单直白的去理解AOP,了解Spring AOP,使用 @AspectJ - 读书笔记
AOP = Aspect Oriental Programing 面向切面编程 文章里不讲AOP术语,什么连接点.切点.切面什么的,这玩意太绕,记不住也罢.旨在以简单.直白的方式理解AOP,理解Sp ...