1142A Walk Through the Forest

2024-05-05 05:48
文章标签 walk forest 1142a

本文主要是介绍1142A Walk Through the Forest,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

公司和家之间隔着一片森林,回家的路有多条,但是每两个岔路口之间只有一条直通的路,如果从公司出发,走a->b这条路的前提是a到家的距离要比b到家的距离远。现在问你最多有多少种走法!

解题思路:

       没认真分析完题目就开始写代码的都是瞎搞,分析完题目后不认真写代码的都是扯淡,出现bug后只会找关键点错误的更是傻逼,为了赋值的时候多写了个==找了大半天,oh!no!. 

      本题其实就是先利用dijkstra,spfa,bellman中的任意一种先计算出各个点到家的最短路,然后dfs出所有满足条件的可能即可!

#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define N 1005
#define inf 0x3fffffff
using namespace std;
struct node{int v;int dis;
};
int dis[N],dp[N];
vector<node>G[N];
bool in_s[N];
struct cmp
{bool operator()(int a,int b){return dis[a]>dis[b];}
};
void spfa(int st,int n){int ui,vi,i,cur,di;for(i=0;i<=n;i++){dis[i]=inf;in_s[i]=false;}priority_queue<int,vector<int>,cmp> s;s.push(st);in_s[st]=true;dis[st]=0;while(!s.empty()){cur=s.top();s.pop();in_s[cur]=false;//这个等号找了半天,啥也不说了!for(i=0;i<G[cur].size();i++){vi=G[cur][i].v;di=G[cur][i].dis;if(dis[vi]>dis[cur]+di){dis[vi]=dis[cur]+di;if(!in_s[vi]){in_s[vi]=true;s.push(vi);}}}}
}
int dfs(int vi){if(vi==2)return 1;if(dp[vi]>0)return dp[vi];for(int i=0;i<G[vi].size();i++){int to=G[vi][i].v;if(dis[vi]>dis[to]){dp[vi]+=dfs(to);}}return dp[vi];
}
int main()
{int n,m,a,b,d,i,j;node temp;while(scanf("%d",&n)&&n){scanf("%d",&m);for(i=0;i<=n;i++)G[i].clear();for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&d);temp.dis=d;temp.v=a;G[b].push_back(temp);temp.v=b;G[a].push_back(temp);}spfa(2,n);memset(dp,0,sizeof(dp));printf("%d\n",dfs(1));}}



这篇关于1142A Walk Through the Forest的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960923

相关文章

array_walk()使用

bool  array_walk (  array &$array ,  callable $callback [,  mixed $userdata = NULL ] ) 将用户自定义函数 funcname 应用到 array 数组中的每个单元。 array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。 array

颠覆多跳事实验证!Causal Walk 前门调整技术引领去偏新纪元

Causal Walk: Debiasing Multi-Hop Fact Verifcation with Front-Door Adjustment 论文地址: Causal Walk: Debiasing Multi-Hop Fact Verification with Front-Door Adjustment| Proceedings of the AAAI Conference

python-小知识点 --- 使用os.walk()遍历目录文件,文件按序号统一重命名

os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情 语法: os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 参数 top – 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。 root 所指的是当前正在遍历的这个文件夹的本

Deep Forest,非神经网络的深度模型

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。  深度学习最大的贡献,个人认为就是表征学习(representation learning),通过端到端的训练,发现更好的features,而后面用于分类(或其他任务)的输出function,往往也只是普通的softmax(或者其他一些经典而又简单的方法)而已,所以,只要特征足够好,分类

hdu3987 Harry Potter and the Forbidden Forest 最小割割边最少

题意:给一个n个点构成的有向图,起点为0,终点为n-1。每条边有一个权值,删除一条边的代价为边权。问如何删除使得0和n-1不 联通且代价最小,在这种情况下至少要删除多少条边。 思路:首先保证代价最小,很容易想到是最小割,但是不知怎么保证割边最少= =看了大神博客。。恍然大悟。。模型真是见得 少。。我们设一个较大的值N(N>数据给的最大边数),将边权变成w*N+1,那么最后求得的最大流对N取

Random Forest GBDT XGBOOST LightGBM面试问题整理

一.知识点 二.特征重要性评估     基于树的集成算法有一个很好的特性,就是模型训练结束后可以输出模型所使用的特征的相对重要性,便于理解哪些因素是对预测有关键影响,有效筛选特征。 Random Forest 袋外数据错误率评估 由于RF采用bootstrapping有放回采样, 一个样本不被采样到的概率为 limm→∞(1−1m)m=1e≈0.368 lim m → ∞

UVa 10596: Morning Walk

这题需要判断两个地方:所有点是否在同一个集合中以及各点的度是否均为偶数(即是否可以构成欧拉回路)。 用dfs得到一个连通分量中点的个数,判断是否与总的点数目相等即可知道是否所有点均在一个连通分量中。 我的代码如下: #include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cst

hdu 4941 Magical Forest(hash映射)

题目链接:hdu 4941 Magical Forest 题目大意:给定N,M和K,表示在一个N*M的棋盘上有K个棋子,给出K个棋子的位置和值,然后是Q次操作,对应的是: 1 a b :交换a和b两行2 a b : 交换a和b两列3 a b :查询a b这个位置上棋子的值,没有棋子的话输出0 解题思路:一开始X[i]

UVA 10596 Morning Walk 简单的k欧拉回路

UVA 10596 Morning Walk 简单的欧拉回路,用并查集判断图是否每个结点连在同一片,然后判断每个节点度数是否都为偶数 解法:没什么好说的直接上代码, 不过要注意的是输出格式 #include <stdio.h>#include <string.h>int n, m;int ru[205];int chu[205];int vi

6.2.4 随机游走(Random Walk)

随机游走这一名称由Karl Pearson在1905年提出[Pearson, K. (1905). The problem of the Random Walk. Nature. 72, 294.],本来是基于物理中"布朗运动"相关的微观粒子的运动形成的一个模型,后来这一模型作为数理金融中的重要的假设,指的是证券价格的时间序列将呈现随机状态,不会表现出某种可观测或统计的确定趋势,即证券价