这题很早之前就遇到过,是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 ,单源最短路径条数与经过的点权最大的更多相关文章

  1. 洛谷 P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  2. Dijkstra算法详细(单源最短路径算法)

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  3. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  4. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

  5. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  6. 单源最短路径算法---Dijkstra

    Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...

  7. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  8. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  9. 【转】Dijkstra算法(单源最短路径)

    原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...

随机推荐

  1. Navicat Premium 12 安装与激活

    一.Navicat Premium 12下载 官方下载地址:https://www.navicat.com.cn/download/navicat-premium 百度云盘:https://pan.b ...

  2. WindowsServer -------------部署软件

    1.windowsServer 中创建 lls 在服务器中创建lls       参考 将文件扩展名调出 2.安装数据库 将数据库传递到服务器中 安装sqlserver 数据库 3.在系统中创建文件存 ...

  3. 【linux】lvm扩展根分区

    lvm扩展根目录 1.lvm的基本概念 physical volume (PV) 通常是一快硬盘.相当于一个物理设备,磁盘空间物理卷PV. volume group (VG) 相当于LVM的卷组,属于 ...

  4. CopyOnWriteArrayList 源码分析 基于jdk1.8

    CopyOnWriteArrayList  源码分析: 1:成员属性: final transient ReentrantLock lock = new ReentrantLock();  //内部是 ...

  5. 集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)

    HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树. put操作 final V putVal(int hash, K key, V v ...

  6. jQuery实现C#CheckBoxList模糊搜索

    前言 最近开发的一套系统中需要对商品进行管理,在选择商品时,要分别从品牌.型号.商品三个类别分别选择对应的选项才能找到需要的商品,三者的关系为:品牌包含型号,型号包含商品,因此使用了三个不同的 asp ...

  7. 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...

  8. 图示详解BERT模型的输入与输出

    一.BERT整体结构 BERT主要用了Transformer的Encoder,而没有用其Decoder,我想是因为BERT是一个预训练模型,只要学到其中语义关系即可,不需要去解码完成具体的任务.整体架 ...

  9. 在AWS中自定义Credential Provider实现Client连接

    今天在使用AWS中,由于原来的 key和secrect是放在配置文件ini里面的.现在需要改成从DB里面获取,所以需要自定义Credential.在AWS中重写这个挺简单的. 我这里是继承原先的Cre ...

  10. PHP之面向对象(下)

    1,类的创建 class 2,对象的创建 new关键字 3,成员的添加 修饰符 添加成员需要三个修饰符 public 公开的 定义公共的属性和方法,类的外部,内部,子类都可以使用 protected ...