这题做的心很累,我用的还是 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. dwSun带你选Python的编辑器/IDE

    dwSun带你选Python的编辑器/IDE Python 是一门简单易学,同时又十分强大的编程语言.特别是随着人工智能的热潮,Python作为AI开发的首选语言,已经是技术人员的必备技能. 在学习和 ...

  2. python 命令行颜色

    #coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -1 ...

  3. cron表达式学习

    一.Cron 是计划任务(定时任务) 二.Cron表达式 Cron表达式是一个字符串,分为6或7个域,每个域用空格分开.Cron有如下两种语法格式: (1) Seconds Minutes Hours ...

  4. C#控件DataGridView笔记

    1.列排序问题,点击列标题行时列会自动排序导致表格混乱.解决办法: 2.改变行高 改变列头行高 ColumnHeadersHeaderSize属性设为 EnableResizing ColumnHea ...

  5. 第一次oo博客作业--表达式求导

    (1)说实话我这部分真的不知道写些什么,因为我只有第三次作业写了两个类,前两次都是一个类,一个类的好处可能也就是写起来比较方便(不用抽象什么共性了,直接c语言莽过去),缺点很多,架构不清晰,可读性不高 ...

  6. nginx+ flume

    nginx 作用: 做负载均衡  nginx和lvs的区别:nginx可以做反向代理 1.上传nginx安装包  tar -zxvf tengine-2.1.02.安装环境  依赖 gcc opens ...

  7. 学生管理系统(javaweb版)

    准备用javaweb 的技术做一个简单的学生管理系统 打算不用登陆的那种,直接进入管理界面. 完成增删改查的功能. 慢慢开始更新,先写那么多.

  8. UGUI脚本添加Btn回调的方法

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...

  9. [Solution] 985. Sum of Even Numbers After Queries

    Difficulty: Easy Question We have an array A of integers, and an array queries of queries. For the i ...

  10. 电话号自动识别之bug解决汇总

    今天测试一个defect: “联系我们”页显示的电话号码,在不同浏览器显示效果不统一,有些浏览器自动识别电话号码并强制添加了样式. 网络搜索发现,其它website 也有类似问题,例如:http:// ...