博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3463 Sightseeing【次短路】
阅读量:7281 次
发布时间:2019-06-30

本文共 1391 字,大约阅读时间需要 4 分钟。

题意: 已知一个有 N 个节点 M 条边的无向图,问最短路和比最短路长度大1 的次短路共有多少条。

分析: 在原来的dijkstra()上加一点变动,d[i][0]记录最短路的长度,d[i][1]记录次短路的长度,dp[i][0] 到达当前点最短路的条数,dp[i][1]到达当前点次短路的条数。

View Code
/************************************************************************************  采用dijstra算法的思想,每次从dis[N][2]中选择一个未被标记且值最小的点dis[v][p]  (可能这个值是这个点的最短路,也可能是次短路,只有当此点的最短路被标记了次才可能选中  此点的次短路).再用这个值val去更新此点的邻接点u.更新的方法如下:  ①如果val小于dis[u][0]    dis[u][1]=dis[u][0]    waynum[u][1]=waynum[u][0]    dis[u][0]=val    waynum[u][0]=waynum[v][p]    否则转②  ②如果val=dis[u][0]    waynum[u][0]+=waynum[v][p]     否则转③  ③如果val小于dis[u][1],     dis[u][1]=val    waynum[u][1]=waynum[v][p]    否则转④  ④如果val等于dis[u][1]    waynum[u][1]+=waynum[v][p]************************************************************************************/#include
#include
#define INF 999999999#define clr(x)memset(x,0,sizeof(x))const int maxn=1005;struct node{ int to,next,w;}e[100005];int tot;int head[maxn];void add(int s,int u,int wi){ e[tot].w=wi; e[tot].to=u; e[tot].next=head[s]; head[s]=tot++;}int n,m,st,en;int d[maxn][2];int dp[maxn][2];int v[maxn][2];int dijkstra(){ int i,j,u,tmp,p,k,dis; clr(v); clr(dp); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) d[i][0]=d[i][1]=INF; d[st][0]=0; dp[st][0]=1; for(i=1;i

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/12/2634325.html

你可能感兴趣的文章
清蒸鲜虾
查看>>
mysql -- 按时间查询 今天、昨天、明天、上月....
查看>>
SharePoint 2013 工作流之年假审批Designer配置篇
查看>>
结对编程项目作业-开发过程
查看>>
20171010
查看>>
linux常用命令
查看>>
day12 字符编码
查看>>
k近邻法
查看>>
数论部分第一节:素数与素性测试【详解】
查看>>
信息学奥赛一本通算法(C++版)基础算法:高精度计算
查看>>
js获取页面宽高大小
查看>>
6.2 中间件-middleware
查看>>
我的第一个游戏FoodieThebug完成之后的心得体会 -子龙山人
查看>>
stretchableImageWithLeftCapWidth:topCapHeight:函数详解
查看>>
hibernate3整合spring2时hibernate即用注解又用配置文件情况时spring配置文件的配置写法...
查看>>
socket编程基础知识
查看>>
Annotation实战【自定义AbstractProcessor】
查看>>
实现自适应屏幕宽高度、超出弹出滚动条
查看>>
进程和线程关系与区别
查看>>
树链剖分总结
查看>>