/*
 *题目大意:
 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;
 *
 *算法思想:
 *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路;
 *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短路和次短路;
 *再用一个cnt二维数组分别记录最短路和次短路的条数;
 *每次更新路径的条数时,不能直接加1,,应该加上cnt[u][k],k为次短路径或者最短路径的标记;
 *图有重边,不能用邻接矩阵存储;
 *不知道为什么,题目上说的是N and M, separated by a single space, with 2≤N≤1000 and 1 ≤ M ≤ 10000;
 *而我的代码硬是把N开成1W了才过,求解释,RE了无数次,擦;
**/ 
#include<iostream> 
#include<cstdio> 
#include<cstring> 
#include<string> 
#include<algorithm> 
using namespace std; 
   
const int N=; 
const int M=; 
const int INF=0xffffff; 
   
struct node 

    int to; 
    int w; 
    int next; 
}; 
   
node edge[N]; 
int head[N]; 
   
int dist[N][],cnt[N][]; 
bool vis[N][]; 
int n,m,s,t,edges; 
   
void addedge(int u,int v,int w) 

    edge[edges].w=w; 
    edge[edges].to=v; 
    edge[edges].next=head[u]; 
    head[u]=edges++; 

   
int dijkstra() 

    int k; 
    for(int i=; i<=n; i++) 
    { 
        dist[i][]=dist[i][]=INF; 
        vis[i][]=vis[i][]=; 
        cnt[i][]=cnt[i][]=; 
    } 
    cnt[s][]=,dist[s][]=; 
   
    for(int i=; i<=n*; i++) 
    { 
        int u=-; 
        int min_dist=INF; 
        for(int j=; j<=n; j++) 
            for(int flag=; flag<; flag++) 
                if(!vis[j][flag]&&dist[j][flag]<min_dist) 
                { 
                    min_dist=dist[j][flag]; 
                    u=j; 
                    k=flag; 
                } 
        if(u==-) 
            break; 
        vis[u][k]=true; 
        for(int e=head[u]; e!=-; e=edge[e].next) 
        { 
            int j=edge[e].to; 
            int tmp=dist[u][k]+edge[e].w; 
   
            if(tmp<dist[j][])//tmp小于最短路径长: 
            { 
                dist[j][]=dist[j][];//次短路径长 
                cnt[j][]=cnt[j][];//次短路径计数 
                dist[j][]=tmp;//最短路径长 
                cnt[j][]=cnt[u][k];//最短路径计数 
            } 
   
            else if(tmp==dist[j][])//tmp等于最短路径长: 
            { 
                cnt[j][]+=cnt[u][k];//最短路径计数 
            } 
   
            else if(tmp<dist[j][])//tmp大于最短路径长且小于次短路径长: 
            { 
                dist[j][]=tmp;//次短路径长 
                cnt[j][]=cnt[u][k];//次短路径计数 
            } 
   
            else if(tmp==dist[j][])//tmp等于次短路径长: 
            { 
                cnt[j][]+=cnt[u][k];//次短路径计数 
            } 
        } 
    } 
   
    int res=cnt[t][]; 
    if(dist[t][]+==dist[t][])//判断最短路和次短路是否相差1 
        res+=cnt[t][]; 
    return res; 

   
int main() 

    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); 
    int tcase; 
    scanf("%d",&tcase); 
    while(tcase--) 
    { 
        edges=; 
        scanf("%d%d",&n,&m); 
        memset(head,-,sizeof(head)); 
        int u,v,w; 
        for(int i=; i<m; i++) 
        { 
            scanf("%d%d%d",&u,&v,&w); 
            addedge(u,v,w); 
        } 
        scanf("%d%d",&s,&t); 
        printf("%d\n",dijkstra()); 
    } 
    return ; 

最短路和次短路问题,dijkstra算法的更多相关文章

  1. 最短路:我的理解--Dijkstra算法

    最短路径:Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处理存在 ...

  2. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  3. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  4. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  5. 单源最短路Dijkstra算法——matlab实现

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

  6. hdu2544 最短路 Dijkstra算法

    最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. 最短路(hdu2544)Dijkstra算法二

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. (转)最短路算法--Dijkstra算法

    转自:http://blog.51cto.com/ahalei/1387799         上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...

  9. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

随机推荐

  1. js中数学运算的处理

    connum = Number(connum) + Number($(this).parents('.123').find(".views_core_hidden").val()) ...

  2. 百度云bcc建站

    一.购买百度云服务 1.百度云bcc购买网页http://bce.baidu.com/product/bcc.html 2.买完后管理:http://console.bce.baidu.com/bcc ...

  3. java多线程系列(一)

    java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  4. HTTP模拟工具【C#/Winform源码】、Json绑定TreeView控件、使用了MetroModernUI、RestSharp、Dapper.Net、Newtonsoft.Json、SmartThreadPool这几个主要开源框架

    HTTP模拟工具 开发语言:C#/Winform开发工具:Visual Studio 2017数据库:   SQLite使用框架:界面-MetroModernUI              Http请 ...

  5. java基础06 IO流

    IO用于在设备间进行数据传输的操作. Java IO流类图结构:   IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...

  6. MAC本上appium连接真机

    简单介绍一下appium连接ios真机测试环境的软件安装及配置过程: 目前我用的是desktop版本的appium, 所以MAC版本必须要升级到10.12以上,Xcode版本必须要在8.0以上,否则亲 ...

  7. request.setcharacterencoding()和request.setcontenttype(“html/css;charset”)的格式区别

    1.request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值 指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默 ...

  8. Selenium webdriver定位iframe里面元素两种方法

    以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...

  9. VerilogHDL概述与数字IC设计流程学习笔记

    一.HDL的概念和特征 HDL,Hard Discrimination Language的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...

  10. tensorflow max_pool(最大池化)应用

    1.最大池化 max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似. tf.nn.max_pool(value, ksize, strides, padding, name=Non ...