这题很早之前就遇到过,是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. linux shell根据端口返回进程号杀死进程的方法

    linux shell根据端口返回进程号杀死进程的方法<pre>kill `lsof -t -i:9501`</pre>这个就是杀死9501端口的进程号

  2. springboot 远程调试

    首先以调试模式启动编译好的jar包,监听端口为5005 java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,addre ...

  3. windows10下录屏

    windows10自带了录屏功能.运行win+G即可打开.如果出现错误,可以运行如下PS脚本. https://files.cnblogs.com/files/mqingqing123/reinsta ...

  4. System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false

    多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制. 这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为f ...

  5. PIE SDK坐标转换算法

    1.算法功能简介 数据坐标转换是空间实体位置的位置描述,是从一种坐标系统变换到另一坐标系统的过程.通过建立两个坐标系之间一一对应关系来实现.是各种比例尺地图测量和编绘中建立地图数学基础必不可少的步骤. ...

  6. Jquery实现左右轮播效果

    首先展示下静态布局h5代码,代码非常简单. <div id="slide"> <ul class="pic-list"> <li& ...

  7. Spring Boot 实战 入门

    目前没有系统学习过 Spring 框架,参与工作时,直接参与到了 Spring Boot 项目的开发.目前还比较菜,所以,你要是和我一样,不妨也跳过 Spring 框架的学习,直接学习 Sring B ...

  8. 开发工具--浅谈Git

    工具|浅谈Git Git这个工具,是我一直想写文章,终于我实现了我的想法.在我开始写之前,发表一下自己的看法,git只是一个工具,既然已经认定是一个工具,那么一定具备工具这类的共同特征,请用面向对象的 ...

  9. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  10. 【转载】Gradle学习 第七章:Java快速入门

    转载地址:http://ask.android-studio.org/?/article/22 7.1. The Java plugin(Java插件) As we have seen, Gradle ...