hdu3191 How Many Paths Are There

2024-05-28 10:48
文章标签 many paths hdu3191

本文主要是介绍hdu3191 How Many Paths Are There,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

求次短路


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll long long
const int N=55;
const int M=2550;
using namespace std;struct node
{int v,w,next;
}e[M];int h,head[N],vis[N][2],d[N][2],cnt[N][2],n,m,s,en;void addedge(int a,int b,int c)
{e[h].v=b;e[h].w=c;e[h].next=head[a];head[a]=h++;
}void dij()
{int i,j,p,dis,flag,x,v,w;memset(d,0x3f,sizeof d);d[s][0]=0;memset(vis,0,sizeof vis);memset(cnt,0,sizeof cnt);cnt[s][0]=1;for(i=0;i<n+n;i++){flag=-1;p=0;dis=inf;for(j=0;j<n;j++){if(!vis[j][0]&&dis>d[j][0]){dis=d[j][0];p=j;flag=0;}else if(!vis[j][1]&&dis>d[j][1]){dis=d[j][1];p=j;flag=1;}}if(flag==-1) break;vis[p][flag]=1;for(x=head[p];x!=-1;x=e[x].next){v=e[x].v;w=e[x].w;if(d[v][0]>w+dis){d[v][1]=d[v][0];cnt[v][1]=cnt[v][0];d[v][0]=w+dis;cnt[v][0]=cnt[p][flag];}else if(d[v][0]==w+dis){cnt[v][0]+=cnt[p][flag];}else if(d[v][1]>w+dis){d[v][1]=w+dis;cnt[v][1]=cnt[p][flag];}else if(d[v][1]==w+dis)cnt[v][1]+=cnt[p][flag];}}
}int main()
{int a,b,c;while(~scanf("%d%d%d%d",&n,&m,&s,&en)){memset(head,-1,sizeof head);h=0;while(m--){scanf("%d%d%d",&a,&b,&c);addedge(a,b,c);}dij();printf("%d %d\n",d[en][1],cnt[en][1]);}return 0;
}


这篇关于hdu3191 How Many Paths Are There的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

【HDU】How Many Answers Are Wrong(带权并查集)

num[i]代表i到根节点的值 这道题一开始竟然以为是线段树= =!后来发现线段树无法进行子区间的维护 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 222222;int fa[maxn],num[maxn];int find_father(int

kubernetes Pod failed to create fsnotify watcher: too many open files

fs.nr_open: 控制单个进程可以打开的文件描述符的最大数量。单个进程的文件描述符限制可以通过 ulimit 命令来设置。 /proc/sys/fs/nr_open 是一个系统级别的全局参数,表示系统中单个进程能够打开的文件描述符总数的限制。/proc/sys/fs/file-max 系统级别,当前系统可打开的最大数量/etc/security/limits.conf 用户级别,指定用户

大数据Java基础-JAVA IO 9】java IO流 (九) Path、Paths、Files的使用

1.NIO的使用说明: >Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP。 >NIO与原来的IO同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。 >NIO将以更加高效的方式进行文件的读写操作。 >随着 JDK 7 的发布,Java对N

LeetCode 63 Unique Paths II

题意: 给出一个带有障碍物的棋盘,每次行动向下或向右移动一格,求从左上角到右下角有几种方案。 思路: 简单dp题,假设dp[i][j]表示第i行第j列的方案数,那么状态转移方程就为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。 注意下边界条件就好了,而且对于障碍物,直接把dp清零即可。 可以发现这个dp只和当前行和上一行有关,进而做空间优化,用一

LeetCode 62 Unique Paths

题意: 一个n*m的棋盘,每次行动只能向下或者向右走1格,求从左上角走到右下角有几种不同的方案数。 思路: 因为行动只能向下向右,所以总步数是一定的,即n - m + 2步。那么问题就变成了这里面的哪几步是向下的,就是组合数了,即从n - m + 2个中选n - 1个的组合数。 题目里说的n和m值太夸张了,因为他的函数返回int……所以肯定很小。 代码: class S

for 出错 ValueError: too many values to unpack (expected 2) 遍历多个变量

贼简单的代码示例 for [i,j] in [range(3),range(3)]:print(i,j) 输出: ValueError: too many values to unpack (expected 2) 正确示例 for i,j in zip(range(3),range(3)):print(i,j) 输出: 0 0 1 1 2 2 原因:后面zip()包装了两个lis

Host '10.10.120.174' is blocked beacuse of many connection errors;

Host '10.10.120.174' is blocked beacuse of many connection errors;unblock with 'mysqldamin flush-hosts' #使用清楚缓存的方法,这样就会把计数清理掉,进入mysql控制台,执行:flush hosts; /usr/bin/mysqladmin  -u jiaobo -puukkgg  flus

nginx 出错:socket() failed (24: Too many open files) while connecting to upstream

1. 错误描述 通过nginx负载两个节点的rabbitmq 当用java代码创建超过500个连接时(我的机器默认只能创建这么多),出现错误: com.rabbitmq.client.ShutdownSignalException: connection errorjava.net.SocketException: Software caused connection abort: recv