1003 Emergency Dijkstra
这题做的心很累,我用的还是 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,
#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的更多相关文章
- PAT 解题报告 1003. Emergency (25)
1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...
- PAT 1003. Emergency (25)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- PAT 1003 Emergency[图论]
1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map ...
- 1003 Emergency (25 分)
1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...
- 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 ...
- 图论 - PAT甲级 1003 Emergency C++
PAT甲级 1003 Emergency C++ As an emergency rescue team leader of a city, you are given a special map o ...
- PAT 甲练习 1003 Emergency
1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...
- 1003 Emergency (25分) 求最短路径的数量
1003 Emergency (25分) As an emergency rescue team leader of a city, you are given a special map of ...
- PAT Advanced 1003 Emergency 详解
题目与翻译 1003 Emergency 紧急情况 (25分) As an emergency rescue team leader of a city, you are given a specia ...
随机推荐
- Linux gzip命令
语法: gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 或 gzip [-acdfhlLnN ...
- 【相关网站 - 02】- Java 好文博客
一.源码分析博客 还有这种操作?浅析为什么要看源码 你觉得什么才是 Java 的基础知识? 1. JDK 2. Mybatis 3. Spring 4. Sring Boot 5. Spring Cl ...
- Nginx动静分离负载均衡
前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. Nginx.conf配置 # 定义Nginx运行的用户 和 用户组 如果对应服务器暴露在外 ...
- 20175126《Java程序设计》第九周学习总结
# 20175126 2016-2017-2 <Java程序设计>第九周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲代码并理解内容学习. - 学习内容为教材第十一章,本章 ...
- python note 08 文件操作
1.相对路径与绝对路径比较 #绝对路径 f = open('d:\pzw.txt',mode='r',encoding='UTF-8') content = f.read() print(conten ...
- ASP.NET Core下发布网站图解
与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...
- 定时执行自动化脚本-(一)导入保存jmeter参数至文件的jar包
1.先完成jmeter脚本编写,具体怎么写此处不再详述,可以参考其他文档. 2.有时你会发现jmeter脚本执行后,有些响应信息你需要提取到文件中,以便后续使用: 怎么实现呢?个人思路就是,先写个ja ...
- 优美序列(sequence)
问题描述 Lxy养了N头奶牛,他把N头奶牛用1..N编号,第i头奶牛编号为i.为了让奶牛多产奶,每天早上他都会让奶牛们排成一排做早操.奶牛们是随机排列的.在奶牛排列中,如果一段区间[L,R]中的数从小 ...
- Maven 生成可执行的jar包
maven 默认打包生成的 jar 包是不能够直接运行的,因为带有 main 方法的类信息不会添加到 manifest 中,即打开 jar 文件中的 META-INF/MANIFEST.MF 文件,将 ...
- GUI学习之八——QToolButton的学习总结
QToolButton提供一个快速的访问按钮,通常在工具栏内使用,一般不显示文本标签而显示图标. 一.按钮的样式风格设置 可以按照下面的风格对按钮进行样式设置 从左到右依次是仅显示图标.仅显示文字.图 ...