题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数。

当年数据结构课程设计用A*做过,现在忘光了,2333

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#define VM 1005
#define EM 10010
using namespace std;
const int inf=0x3f3f3f3f;
int head[VM],cnt[VM][],dist[VM][],vis[VM][];//dis[i][0]为最短路,dis[i][1]为次短路
int e,src,des,n,m;
struct E
{
int to,w,next;
} edge[EM];
void add(int cu,int cv,int cw)
{
edge[e].to=cv;
edge[e].w=cw;
edge[e].next=head[cu];
head[cu]=e ++;
}
int dij()
{
int i,j,u,min,flag;
memset(dist,0x3f,sizeof(dist));
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
dist[src][]=;
cnt[src][]=;
for(i=;i<*n;i++)
{
min=inf;
for(j=;j<=n;j++) //找新的最短路和次短路
if(!vis[j][]&&dist[j][]<min)
{
u=j;
flag=;
min=dist[j][];
}
else if(!vis[j][]&&dist[j][]<min)
{
u=j;
flag=;
min=dist[j][];
}
if(min==inf)
break;
vis[u][flag]=;
for(j=head[u];j!=-;j=edge[j].next)
{
int v=edge[j].to;
int w=edge[j].w+min;
if(dist[v][]>w) //如果找到的新的值比最短路小,则更新最短路和次短路的值
{
dist[v][]=dist[v][];//更新次短路
dist[v][]=w;// 更新最短路
cnt[v][]=cnt[v][];
cnt[v][]=cnt[u][flag];//更新最短路和次短路的个数 }
else if(dist[v][]==w) //如果值等于最短路
cnt[v][]+=cnt[u][flag];//更新最短路的个数
else if(dist[v][]>w) //如果找到的值小于次短路的值,更新次短路
{
dist[v][]=w; //更新次短路的值
cnt[v][]=cnt[u][flag]; //更新次短路的个数
}
else if(dist[v][]==w) //如果找到的值等于次短路的值
cnt[v][]+=cnt[u][flag];//更新次短路的个数
} }
if(dist[des][]+==dist[des][])//如果次短路的值等于最短路值+1
cnt[des][]+=cnt[des][];
return cnt[des][];
}
int main()
{
int T,u,v,w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(head,0xff,sizeof(head));
e=;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
scanf("%d%d",&src,&des);
int ans=dij();
printf("%d\n",ans);
}
return ;
}

poj 3463 次短路的更多相关文章

  1. poj 3463 最短路与次短路&&统计个数

    题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA //不能 ...

  2. poj 3463 最短路+次短路

    独立写查错不能,就是维护一个次短路的dist 题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数. Sample Input25 81 2 31 3 21 4 52 3 12 5 ...

  3. poj 3463 最短路与次短路的方案数求解

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8968   Accepted: 3139 Descr ...

  4. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  5. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

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

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

  7. poj 3463/hdu 1688 求次短路和最短路个数

    http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...

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

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

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

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

随机推荐

  1. linux中core dump开启使用教程【转】

    转自:http://www.111cn.net/sys/linux/67291.htm 一.什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各 ...

  2. aarch64_m3

    mrpt-stereo-camera-calibration-1.4.0-1.fc26.aarch64.rpm 2017-03-17 10:02 143K fedora Mirroring Proje ...

  3. 16 Go Concurrency Patterns: Timing out, moving on GO并发模式: 超时, 继续前进

    Go Concurrency Patterns: Timing out, moving on  GO并发模式: 超时, 继续前进 23 September 2010 Concurrent progra ...

  4. tensorflow session 和 graph

    graph即tf.Graph(),session即tf.Session(),很多人经常将两者混淆,其实二者完全不是同一个东西. graph定义了计算方式,是一些加减乘除等运算的组合,类似于一个函数.它 ...

  5. 日期时间设置 "2018-05-04T16:36:23.6341371+08:00" 格式

    using System;using System.Collections.Generic;using System.Globalization;using System.Text; namespac ...

  6. Python学习笔记:出生日期转化为年龄

    在数据挖掘项目中,有时候个体的出生日期包含信息量过大,不适合作为一个有效数据进入模型算法训练,因此有必要把出生日期转化为年龄age,age是一个很好的特征工程指示变量. import pandas a ...

  7. MySQL学习笔记:coalesce

    函数:coalesce 作用:返回传入的参数中第一个非NULL的值 ); # ); # 如果传入的参数所有都是NULL,则返回NULL,比如: SELECT COALESCE(NULL, NULL, ...

  8. 在Visio里加上、下标方法

    添加上标:选中要成为上标的文字,ctrl+shift+“=” 添加下标:选中要成为下标的文字,ctrl+“=”

  9. C++中bool类型变量初值对程序的影响

    很困惑的一个问题 #include<iostream> using namespace std; int main() { //bool a=true; //非0(1,2,3,……)输出1 ...

  10. Linux 中 &、jobs、fg、bg 等命令

    参考  Unix 或 Linux 中 &.jobs.fg.bg 等命令的使用方法 对之前文章的一个补充: linux 命令后台运行 这篇还是比较简单的,稍微一带而过 fg.bg.jobs.&a ...