最短路径 | 1003 dfs 或 dij ,单源最短路径条数与经过的点权最大
这题很早之前就遇到过,是pat留给我的第一印象,然而昨天却有点写不出来。今天dfs用了10分钟不到写出来了。dij用了大约15分钟,捉虫花了一点时间。
dfs:
注意剪枝的时候别剪错就行了。
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map> #define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)+1
#define V vector<int> using namespace std; int n,m,s,e;
int team_set[LEN];
int g[LEN][LEN];
int way_cnt=;
int best_cost=MAX;
int best_team=;
int vis[LEN]; void dfs(int v,int cost,int team){
if(v==e){
if(cost<best_cost){
best_cost=cost;
best_team=team;
way_cnt=;
}else if(cost==best_cost){
way_cnt++;
if(team>best_team)
best_team=team;
}
return;
}
vis[v]=;
int i; //↓注意剪枝的判断语句,不要把≤写成<
FF(i,n) if(g[v][i] && !vis[i] && cost+g[v][i]<=best_cost){
dfs(i,cost+g[v][i],team+team_set[i]);
}
vis[v]=;
} int main(){
// freopen("D:\\CbWorkspace\\PAT\\最短路径\\1003.txt","r",stdin);
int a,b,c,i;
I("%d%d%d%d",&n,&m,&s,&e);
FF(i,n) I("%d",&team_set[i]);
FF(i,m){
I("%d%d%d",&a,&b,&c);
g[a][b]=c;
g[b][a]=c;
}
dfs(s,,team_set[s]);
printf("%d %d\n",way_cnt,best_team);
return ;
}
dij:
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map> #define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)-1
#define V vector<int> using namespace std; int n,m,s,e;
int team_set[LEN];
int g[LEN][LEN];
int way_cnt[LEN];
int vis[LEN];
int dist[LEN];
int team[LEN]; int main(){
// freopen("D:\\CbWorkspace\\PAT\\最短路径\\1003.txt","r",stdin);
int a,b,c,i;
I("%d%d%d%d",&n,&m,&s,&e);
FF(i,n) I("%d",&team_set[i]);
fill(g[],g[]+LEN*LEN,MAX);
fill(dist,dist+LEN,MAX);
FF(i,m){
I("%d%d%d",&a,&b,&c);
g[a][b]=c;
g[b][a]=c;
}
dist[s]=;
team[s]=team_set[s];
way_cnt[s]=;
while(){
int u=-,d=MAX;
FF(i,n){
if(!vis[i] && dist[i]<d){
u=i;
d=dist[i];
}
}
if(u<) break;
vis[u]=;
FF(i,n) if(!vis[i]){
if(dist[u]+g[u][i]<dist[i]){
dist[i]=dist[u]+g[u][i];
team[i]=team[u]+team_set[i];
way_cnt[i]=way_cnt[u];
}else if(dist[u]+g[u][i]==dist[i]){
way_cnt[i]+=way_cnt[u];
if(team[i]<team[u]+team_set[i]){
team[i]=team[u]+team_set[i];
}
}
}
}
printf("%d %d\n",way_cnt[e],team[e]);
return ;
}
bug出现在多条最短路径的更新问题上。没有写else if 而是写了 if ,导致出错。
最短路径 | 1003 dfs 或 dij ,单源最短路径条数与经过的点权最大的更多相关文章
- 洛谷 P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
- Dijkstra算法详细(单源最短路径算法)
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- 洛谷P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...
- 单源最短路径算法---Dijkstra
Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
- 【转】Dijkstra算法(单源最短路径)
原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...
随机推荐
- Navicat Premium 12 安装与激活
一.Navicat Premium 12下载 官方下载地址:https://www.navicat.com.cn/download/navicat-premium 百度云盘:https://pan.b ...
- WindowsServer -------------部署软件
1.windowsServer 中创建 lls 在服务器中创建lls 参考 将文件扩展名调出 2.安装数据库 将数据库传递到服务器中 安装sqlserver 数据库 3.在系统中创建文件存 ...
- 【linux】lvm扩展根分区
lvm扩展根目录 1.lvm的基本概念 physical volume (PV) 通常是一快硬盘.相当于一个物理设备,磁盘空间物理卷PV. volume group (VG) 相当于LVM的卷组,属于 ...
- CopyOnWriteArrayList 源码分析 基于jdk1.8
CopyOnWriteArrayList 源码分析: 1:成员属性: final transient ReentrantLock lock = new ReentrantLock(); //内部是 ...
- 集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)
HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树. put操作 final V putVal(int hash, K key, V v ...
- jQuery实现C#CheckBoxList模糊搜索
前言 最近开发的一套系统中需要对商品进行管理,在选择商品时,要分别从品牌.型号.商品三个类别分别选择对应的选项才能找到需要的商品,三者的关系为:品牌包含型号,型号包含商品,因此使用了三个不同的 asp ...
- 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...
- 图示详解BERT模型的输入与输出
一.BERT整体结构 BERT主要用了Transformer的Encoder,而没有用其Decoder,我想是因为BERT是一个预训练模型,只要学到其中语义关系即可,不需要去解码完成具体的任务.整体架 ...
- 在AWS中自定义Credential Provider实现Client连接
今天在使用AWS中,由于原来的 key和secrect是放在配置文件ini里面的.现在需要改成从DB里面获取,所以需要自定义Credential.在AWS中重写这个挺简单的. 我这里是继承原先的Cre ...
- PHP之面向对象(下)
1,类的创建 class 2,对象的创建 new关键字 3,成员的添加 修饰符 添加成员需要三个修饰符 public 公开的 定义公共的属性和方法,类的外部,内部,子类都可以使用 protected ...