给出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)-最短路径+路径数目的更多相关文章

  1. PAT甲题题解-1010. Radix (25)-二分搜索

    题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...

  2. PAT甲题题解-1032. Sharing (25)-链表水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  3. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...

  4. PAT甲题题解-1070. Mooncake (25)-排序,大水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  5. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

  6. PAT甲题题解-1006. Sign In and Sign Out (25)-找最小最大

    判断哪个人最早到,哪个人最晚走水,就是找最大值最小值 #include <iostream> #include <cstdio> #include <algorithm& ...

  7. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  8. 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 ...

  9. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

随机推荐

  1. 在Linux服务器上运行Jupyter notebook server教程

    在Linux服务器上运行Jupyter notebook server教程 很多deep learning教程都推荐在jupyter notebook运行python代码,方便及时交互.但只在本地运行 ...

  2. Google常用脚本

    1.Tampermonkey 可下载常用脚本:https://greasyfork.org/zh-CN 2.常用FQSetupVPN 3.百度药丸屏蔽广告 4.百度文档可粘贴,下载 5.VIP视频可看

  3. Test传送门(更新中)

    一.Codeforces传送门: Avito Code Challenge 2018 题解传送门 Codeforces Round #485 (Div. 2)     题解传送门 二.hihocode ...

  4. 流式套接字:基于TCP协议的Socket网络编程(案例3)

    案例:在案例1的基础上将传输的字符串换成具体的对象. 客户端代码: package com.yh.SocketObject; import java.io.IOException; import ja ...

  5. css心跳动画

    1.图片无限放大缩小,类似心跳 css如下 @keyframes scaleDraw { /*定义关键帧.scaleDrew关键帧名称*/ 0%{ transform: scale(1); /*开始为 ...

  6. MVC 拦截指定的action

    有时,我们需要在特定的一些aciton中做校验.比如:验证是否登录.实现方式有两种: 一.编写一个公共的方法专门用于实现是否登录的验证,然后在每个需要进行验证的aciton的头部去调用该方法,根据方法 ...

  7. Eclipse-设置启动JDK版本

    打开eclipse安装目录下的eclipse.ini文件,将红色内容加入 -vm ../Java/jdk1.6.0_26/bin (或者指向具体目录:D:/software/jdk_1.8u91/bi ...

  8. storm报错:Exception in thread "main" java.lang.RuntimeException: InvalidTopologyException(msg:Component: [mybolt] subscribes from non-existent stream: [default] of component [kafka_spout])

    问题描述: storm版本:1.2.2,kafka版本:2.11.   在使用storm去消费kafka中的数据时,发生了如下错误. [root@node01 jars]# /opt/storm-1. ...

  9. Exp7

    实验内容 简单应用SET工具建立冒名网站 kali IP: 192.168.1.160 (原198) win7 IP: 192.168.1.199 1.开启本机Apache服务 (1)查看80端口是否 ...

  10. 20155317《网络对抗》Exp4 恶意代码分析

    20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...