最短路径 | 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 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...
随机推荐
- Github的初始设置
设置姓名和邮箱地址 git config --global user.name "Firstname Lastname" git config --global user.emai ...
- ShellScript之变量
Shell脚本之变量学习 ##########################ShellScript初学者,文章摘自菜鸟教程################################ 1.She ...
- Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent first Classloader
众所周知,Java的类加载机制采用了双亲委派模型,导致在进行类加载的时候会有多个加载器,这种复杂的机制,有时候会导致‘Exception in thread main java.lang.NoClas ...
- 如何解决aws解绑银行卡问题?
首先先来说明一下我自己的情况? 一年的免费使用 前提:没有开启任何的实例服务 先贴一条官方的解释 关于我小白一个.学校课程要求使用aws,注册之后在网络上看到一堆人踩坑,aws的扣费就是个坑! 预授权 ...
- 基于word2vec的文档向量模型的应用
基于word2vec的文档向量模型的应用 word2vec的原理以及训练过程具体细节就不介绍了,推荐两篇文档:<word2vec parameter learning explained> ...
- 前端学习:JS学习总结(图解)
前端学习:JS学习总结(图解) JS的代码笔记 JS比HTML和CSS的知识点要多的多,下面分几段来介绍其内容... 为了能让大家更好的检索,前面的图解是整个JS的概括,后面的才是知识点... 旁边就 ...
- PHP 垃圾回收机制详解
前言:之前对PHP的GC只是了解了个大概,这次详细了解下PHP的垃圾回收机制(GC). 介于网上大部分都是PHP5.X的GC,虽然 php5 到 php7 GC部分做出的改动较小,但我觉得还是一起写下 ...
- webform 的路由
webform是怎么通过url找到对应handler的呢? mvc 和webapi的路由都是通过注册到RouteTable.Routes中,然后在urlroutingmodule中路由到对应route ...
- Git远程协作和分支
一.远程基本操作 基本的配置远程仓库有两个命令: git remote add origin git@github.com:ZXZxin/gitlearn.git : git push -u orig ...
- 1-Kong文章记录
参考: https://www.cnblogs.com/duanxz/p/9770645.html 系列博客可参考: 开源API网关系统(Kong教程)入门到精通 https://www.cnblog ...