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一遍找最大最小值,水题 # ...
随机推荐
- MyBatis 中的级联
MyBatis 的级联分为 3 种. 1.鉴别器(discriminator):它是根据某些条件决定采用具体实现类级联的方案,比如体检表要根据性别去区分. 2.一对一(association):比如学 ...
- django复习-3-请求与响应
一.请求request 前端向后端传递参数有几种方式? 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取: "http://127. ...
- leetcode 1. Two Sum [java]
注意点: HashMap<Integer, Integer> return new int[]{}; 3 2 4 target:6 return null; public int[] tw ...
- css图片替换方法
图片替换主要是指将文字替换成图片的技术,即在html语句中使用文字,浏览器显示时用对应的图片显示.其意义在于便于做网站优化(SEO),因为文字才是搜索引擎寻找的主要对象. https://www.cn ...
- 13.4SolrCloud集群使用手册之CRUD
转载请出自出处:http://www.cnblogs.com/hd3013779515/ Student.java package cn.ljh.ssm.test; import org.apache ...
- iosclient发现_世界杯送流量活动项目总结
世界杯如火如荼的进行.视频站点相似于门户站点.须要高速依据外部环境更新内容. 产品经理须要策划活动,并安排实施.这个活动就是在这样背景下产生的,爱奇艺与运营商合作,实现双赢.爱奇艺能够通过运营商 ...
- 【转】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点
Poco 1.4.2 HTTPClientSession/HTTPClientSession 在使用代理的时候,request的URI不能包含协议和主机.否则会出错. 不使用代理的时候,以下代码能正常 ...
- JCR分区(WOS或Thomson Reuters或汤姆森 路透)和中科院分区(附网址及查询方法)
https://blog.csdn.net/Sunflower02/article/details/81187569
- PAT B1027 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...
- Windows10 + eclipse + JDK1.8 + Apache Maven 3.6.0 + dl4j深度学习环境配置
Windows10 + eclipse + JDK1.8 + Apache Maven 3.6.0 + dl4j深度学习环境配置 JDK下载安装请自行,并设置好环境变量1 查看Java版本C:\Use ...