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一遍找最大最小值,水题 # ...
随机推荐
- 开通博客啦 Let‘s Go!
入园两年半,在博客园学到很多知识.得到了很大帮助,今天终于开通博客啦,准备将自己所学到的有用知识分享给大家,共同学习共同进步.
- 一篇关于介绍php的几个user 认证相关的几个包
http://kodeinfo.com/post/laravel-authentication-packages LARAVEL AUTHENTICATION PACKAGES By Imran Iq ...
- 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案
阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...
- mod_php和mod_fastcgi和php-fpm的介绍,对比和性能数据
1.php中fastcgi和php-fpm是什么东西 最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕 ...
- 关于JRebel启动tomcat访问上次工程的index.jsp
检查了一下,原来我把上次配置文件包括JRebel配置文件一起复制过来,用JRebel启动时tomcat访问JRebel配置文件的目录下 这个是我上次文件的路径,把JRebel配置文件删除了,然后 di ...
- 洛谷P4053 [JSOI2007]建筑抢修
放题解 题目传送门 放代码 #include <bits/stdc++.h>//万能头 #define MAXN 150000//最多的建筑数量(数据范围) using namespace ...
- 第三方git pull免密码更新
方法一: git pull http://账号:密码@服务器地址/xxx/xxx.git master:master 方法二: 或者使用ssh免密码,生成的pub公钥内容拷贝的auth文件里面,同时添 ...
- Python2.7-glob
glob 模块,寻找所有匹配指定的模式的路径名,利用的是 Unix shell 的规则,可以在 Windows 环境下使用.模块是通过 os.listdir() 和 fnmatch.fnmatch() ...
- 测试计划&性能测试分析报告模板(仅供参考)
一.测试计划 1. 引言 1.1 编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1 测试对象 4.2 需要测试的特性 4.3 无需测试的特性 5. 测试启动与结束准则 5.1 ...
- mysql,int(5)、int(10)啥区别联系
实际没啥区别..这个5和10并不是最大5位,最大10位的意思. 好比选择了int(5),并且当你选择了0填充的话.你的数据假设存了123,那么你的显示会是00123,(有些操作mysql的工具看不出来 ...