F - Sightseeing

传送门: POJ - 3463

分析

一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数。

这道题唯一要注意的就是次短路的求法

首先题目中说从起点到终点至少有一条路径,所以我们就不用考虑不可达的情况

我们先考虑如果a到b有一条边,b到c有一条边

那么a到c经过b的路程中次短路只有两种选择,一种是a到b的最短路+b到c的次短路,另一种是a到b的次短路+b到c的次短路

所以我们只需要记录次短路和最短路两个值就可以了

然后我们去跑dij,每次加上一条边会有四种情况对答案产生影响

1.比最短路短

如果之前的最短路不为无穷大的话,我们就把原先最短路的值赋值给原先次短路的值,同时把次短路的数量更新为原先最短路的数量

再更新最短路,同时要把最短路的数量改为到达上一个节点的方案数

2.和最短路一样短

把最短路的数量加一

3.比次短路短

更新次短路的长度,同时要把次短路的数量改为到达上一个节点的方案数

4.和次短路一样长

把次短路的数量加一

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int maxd=1005,maxb=20005;
int head[maxd],tot=1;
struct asd{
int from,to,next,val;
}b[maxb];
void ad(int aa,int bb,int cc){
b[tot].from=aa;
b[tot].to=bb;
b[tot].val=cc;
b[tot].next=head[aa];
head[aa]=tot++;
}
struct jie{
int num,dis,jud;
jie(int aa=0,int bb=0,int cc=0){
num=aa,dis=bb,jud=cc;
}
bool operator < (const jie& A) const{
return dis>A.dis;
}
};
priority_queue<jie> q;
int dis[maxd][3],cnt[maxd][3];
bool vis[maxd][3];
void dij(int xx){
memset(dis,0x3f,sizeof(dis));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
dis[xx][0]=0,cnt[xx][0]=1;
q.push(jie(xx,0,0));
while(!q.empty()){
int now=q.top().num;
int judd=q.top().jud;
q.pop();
if(vis[now][judd]) continue;
vis[now][judd]=1;
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
int ndis=dis[now][judd]+b[i].val;
if(ndis<dis[u][0]){
if(dis[u][0]!=0x3f3f3f3f){
dis[u][1]=dis[u][0];
cnt[u][1]=cnt[u][0];
q.push(jie(u,dis[u][0],1));
}
dis[u][0]=ndis;
cnt[u][0]=cnt[now][judd];
q.push(jie(u,ndis,0));
}
else if(ndis==dis[u][0]){
cnt[u][0]+=cnt[now][judd];
}
else if(ndis==dis[u][1]){
cnt[u][1]+=cnt[now][judd];
}
else if(ndis<dis[u][1]){
dis[u][1]=ndis;
cnt[u][1]=cnt[now][judd];
q.push(jie(u,ndis,1));
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(head,-1,sizeof(head));
memset(&b,0,sizeof(struct asd));
tot=1;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int aa,bb,cc;
scanf("%d%d%d",&aa,&bb,&cc);
ad(aa,bb,cc);
}
int qd,zd;
scanf("%d%d",&qd,&zd);
dij(qd);
int ans=cnt[zd][0];
if(dis[zd][0]==dis[zd][1]-1) ans+=cnt[zd][1];
printf("%d\n",ans);
}
return 0;
}

POJ - 3463 Sightseeing 最短路计数+次短路计数的更多相关文章

  1. poj 3463 Sightseeing——次短路计数

    题目:http://poj.org/problem?id=3463 当然要给一个点记最短路和次短路的长度和方案. 但往优先队列里放的结构体和vis竟然也要区分0/1,就像把一个点拆成两个点了一样. 不 ...

  2. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  3. POJ 3463 Sightseeing 【最短路与次短路】

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  4. poj 3463 Sightseeing(次短路+条数统计)

    /* 对dij的再一次理解 每个点依旧永久标记 只不过这里多搞一维 0 1 表示最短路还是次短路 然后更新次数相当于原来的两倍 更新的时候搞一下就好了 */ #include<iostream& ...

  5. POJ 3463 Sightseeing (次短路)

    题意:求两点之间最短路的数目加上比最短路长度大1的路径数目 分析:可以转化为求最短路和次短路的问题,如果次短路比最短路大1,那么结果就是最短路数目加上次短路数目,否则就不加. 求解次短路的过程也是基于 ...

  6. POJ 3463 Sightseeing 题解

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  7. POJ 3463 Sightseeing (次短路经数)

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:10005   Accepted: 3523 Descr ...

  8. POJ 3463 Sightseeing

    最短路+次短路(Dijkstra+priority_queue) 题意是要求你找出最短路的条数+与最短路仅仅差1的次短路的条数. 開始仅仅会算最短路的条数,和次短路的长度.真是给次短路条数跪了.ORZ ...

  9. POJ 3463 有向图求次短路的长度及其方法数

    题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...

随机推荐

  1. 【Mysql】使用一条sql查询出库表结构信息

    1.新建查询 将以下脚本粘贴进去 脚本如下: SELECT TABLE_SCHEMA 库名, TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA ...

  2. Node.js躬行记(3)——命令行工具

    一.自定义 创建一个空目录,然后通过npm init命令初始化package.json文件,并按提示输入相关信息或直接回车使用默认信息,生成的内容如下所示. { "name": & ...

  3. Windows环境下PHP安装pthreads多线程扩展

    一.判断PHP是ts还是nts版 通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版. ...

  4. 用Springboot干掉IBM的WAS-为公司省点钱

    1 那一夜,你伤害了我 今夜的雨下得凉快,小南睡得正香,突然收到远洋运维小周的电话:Hello, Are you OK? WAS有issue,快起来help me! 只见小南登陆WAS机,查看了机器日 ...

  5. Python多线程 - threading

    目录 1. GIL 2. API 3. 创建子线程 4. 线程同步 4.1. 有了GIL,是否还需要同步? 4.1.1. 死锁 4.1.2. 竞争条件 4.1.3. GIL去哪儿了 4.2. Lock ...

  6. java中int和Integer的区别?为什么有了int还要有设计Integer?

    参考https://blog.csdn.net/chenliguan/article/details/53888018 https://blog.csdn.net/myme95/article/det ...

  7. PIP设置镜像源

    PIP设置镜像源 pip安装Python包时候,默认是国外的下载源,速度太慢,本文介绍几种设置pip国内镜像源的方法 镜像源 阿里云 http://mirrors.aliyun.com/pypi/si ...

  8. 利用requets库采集蘑菇租房网的租房信息

    前言:对于我们任何一个漂泊在外的打工者,租房似乎都是我们必经的一个经历,对于我们而言,选择性价比最高,最适合自己的房源至关重要,本文就将利用爬虫技术采集蘑菇租房网上指定的房源信息,后续可以利用这些信息 ...

  9. 005.OpenShift访问控制-权限-角色

    一 Kubetcl namespace 1.1 namespace描述 Kubernetes namespace提供了将一组相关资源组合在一起的机制.在Red Hat OpenShift容器平台中,p ...

  10. EM(最大期望)算法推导、GMM的应用与代码实现

    EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计. 使用EM算法的原因 首先举李航老师<统计学习方法>中的例子来说明为什么要用EM算法估计含有隐变量的概率模型参数. 假设 ...