这题做的心很累,我用的还是 1018的思路做的,但是 使用dfs 求最大人数对于某些有问题(现在也不知道错哪了),

看了别人的代码后才发现,其实完全不用这么麻烦,只需设置一个点的权重,一遍DJ(自创简称)下来,直接出答案

收获:

1.DJ不需要存储具体路径也能知道最短路径有几条:

在DJ外设置一个road【n】数组,初始为0;road【源】=1;//road表示,从源出发,到n的最短路径条数

在更新环节

for()

{

  if当dis[u] + e[u][v] < dis[v]

    road【v】=road【u】;

  else if当dis[u] + e[u][v] == dis[v]

    road【v】=road【v】+road【u】;    //通过U到V的路,加上不经过U到V的条数

}//每个road【i】就是从源到i的最短路径条数了

2.使用点权解决不需要输出路径的问题

我在某大神的DJ算法中更新dis的部分看到了这样一句话

for(int v = 0; v < n; v++) {//已经找到一个集合外的最小点 u,

            if(visit[v] == false && e[u][v] != inf) {   《-------这一句判断,不加这一句就是正常的思路,//对于既不是集合内的点,从U出发又不可达的点就跳过,感觉没有必要
                if(dis[u] + e[u][v] < dis[v]) {      //因为这句判断本身已经要对所有输入都判断一次了
                    dis[v] = dis[u] + e[u][v];
                }
            }
 
 
我的部分正确代码:
 #include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int inf=;
int e[][];
int man[]={};
int N,M,C1=,C2;
int a,b,c;
int num=,most=;//最短路径数,最大人数
vector<int> pre[];
vector<int> path,tmppath;
void dfs(int x)//由于存的是到达x的最短路径的前一个点,所以从后往前走C2起步
{
tmppath.push_back(x);
if(x==C1)
{
num++;
a=;
for(int i=tmppath.size()-;i>=;i--)//i初始化为路径上C1的下一个点
{
a+=man[i];
}
if(a>most)
{
path=tmppath;
most=a;
}
}
else
{
for(int i=;i<pre[x].size();i++)
{
dfs(pre[x][i]);
}
}
tmppath.pop_back();
} int main()
{
scanf("%d%d%d%d",&N,&M,&C1,&C2);
int dis[N];//DJ 距离
int mark[N];//DJ 标记
for(int i=;i<N;i++)
{
for(int j=;j<N;j++)
e[i][j]=inf;
dis[i]=inf;
scanf("%d",&man[i]);
mark[i]=; }
for(int i=;i<M;i++)
{
scanf("%d%d%d",&a,&b,&c);
e[a][b]=e[b][a]=c; }
dis[C1]=;//DJ初始化
int now=C1,fast;
for(int i=;i<N;i++)//每次加入一个点
{
fast=inf;
for(int j=;j<N;j++)
{
if(dis[j]<fast&&mark[j]==)//dis 小于当前发现的最小,并且没有被加入
{
now=j;
fast=dis[j];
}
}
if(fast==inf)break;//所有可达点都加入了
mark[now]=;//加入该点
for(int j=;j<N;j++)//用当前该点更新dis,并且更新pre
{
if(dis[now]+e[j][now]<dis[j])
{
dis[j]=dis[now]+e[j][now];
pre[j].clear();
pre[j].push_back(now);
}
else if(dis[now]+e[j][now]==dis[j])
{
pre[j].push_back(now);
}
}
}//DJ 结束,dis[C2],为最短距离
dfs(C2);//使用深搜 求出最短路径的条数 和 最大人数
printf("%d %d",num,most); return ;
}

mycode

正确代码:

#include <iostream>
#include <algorithm>
using namespace std;
int n, m, c1, c2;
int e[][], weight[], dis[], num[], w[];
bool visit[];
const int inf = ;
int main() {
scanf("%d%d%d%d", &n, &m, &c1, &c2);
for(int i = ; i < n; i++)
scanf("%d", &weight[i]);
fill(e[], e[] + * , inf);
fill(dis, dis + , inf);
int a, b, c;
for(int i = ; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
e[a][b] = e[b][a] = c;
}
dis[c1] = ;
w[c1] = weight[c1];
num[c1] = ;
for(int i = ; i < n; i++) {
int u = -, minn = inf;
for(int j = ; j < n; j++) {
if(visit[j] == false && dis[j] < minn) {
u = j;
minn = dis[j];
}
}
if(u == -) break;
visit[u] = true;
for(int v = ; v < n; v++) {
if(visit[v] == false && e[u][v] != inf) {
if(dis[u] + e[u][v] < dis[v]) {
dis[v] = dis[u] + e[u][v];
num[v] = num[u];
w[v] = w[u] + weight[v];
} else if(dis[u] + e[u][v] == dis[v]) {
num[v] = num[v] + num[u];
if(w[u] + weight[v] > w[v])
w[v] = w[u] + weight[v];
}
}
}
}
printf("%d %d", num[c2], w[c2]);
return ;
}

right code

 
 
 
 
 
 
 
 

1003 Emergency Dijkstra的更多相关文章

  1. PAT 解题报告 1003. Emergency (25)

    1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...

  2. PAT 1003. Emergency (25)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  3. PAT 1003 Emergency[图论]

    1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map ...

  4. 1003 Emergency (25 分)

    1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...

  5. 1003 Emergency (25)(25 point(s))

    problem 1003 Emergency (25)(25 point(s)) As an emergency rescue team leader of a city, you are given ...

  6. 图论 - PAT甲级 1003 Emergency C++

    PAT甲级 1003 Emergency C++ As an emergency rescue team leader of a city, you are given a special map o ...

  7. PAT 甲练习 1003 Emergency

    1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...

  8. 1003 Emergency (25分) 求最短路径的数量

    1003 Emergency (25分)   As an emergency rescue team leader of a city, you are given a special map of ...

  9. PAT Advanced 1003 Emergency 详解

    题目与翻译 1003 Emergency 紧急情况 (25分) As an emergency rescue team leader of a city, you are given a specia ...

随机推荐

  1. 大型分布式架构设计与实现-第一章SOA(面向服务的体系架构)

    拜读了大型分布式架构设计与实现,觉得该书作为入门不错,但内容过于简单,描述过于琐碎,小节之间连续性不强,不适合深入钻研学习.但为了更多的希望向架构师行业靠拢的工程师学习需要,本博客将对上书进行简化讲解 ...

  2. Day08 - Ruby比一比:String的+=与concat串接

    前情提要: 在第七天我们透过比较Symbol和String,发现字串比符号多了更多方法!为了活用string method,今天我们接续前文,来探讨一题跟字串有关的题目: Ruby经典面试题目#08( ...

  3. 项目需求分析与建议-NABCD模型

    N(Need 需求) 首先我们的创意解决了现有阶段学校查空余教师的问题,充分解决了同学们上自习却找不到教室的苦衷,同时也会适当的拓展一些适当的学习计时功能或者每日一语等等,来帮助同学们来控制好学习时间 ...

  4. R语言-图形辅助

    1.画底纹格子    grid()函数 > plot(rnorm(100)) > grid() #画底纹格子 > grid(nx=NA, ny=8, #画水平底纹,横坐标无分隔,纵坐 ...

  5. 关于Linux 文件权限的思考

    Linux文件系统每个文件分为inode和block,inode中包含一些基本信息(文件名,类型,长度,修改时间,权限等待),并且指向包含文件真实内容的block,而目录是文件的一种,其block的内 ...

  6. python爬虫的scrapy安装+pymongo的安装

    我的:python2.7版本    32位 注意scrapy只支持2.7及以上的版本. 1.安装python 2.安装pip 安装pip就不赘述了,网上很多教学 pip安装时要注意更新,如果pip版本 ...

  7. 15. 3Sum (JAVA)

    Given an array nums of n integers, are there elements a, b, cin nums such that a + b + c = 0? Find a ...

  8. H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛

    题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...

  9. eclipse中启动服务时提示端口被占的2种解决方案

    出现类似这样的:port '19001' at localhost are already in use 第一种:在任务管理器中关闭相关eclipse进程,然后重启eclipse.这种方法可能有时候会 ...

  10. Memcached和Memcache安装(64位win7)[z]

    http://www.cnblogs.com/lucky-man/p/6126667.html 一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理 ...