oooccc1 is a Software Engineer who has to ride to the work place every Monday through Friday. For a long period, he went to office with the shortest path because he loves to sleep late…Time goes by, he find that he should have some changes as you could see, always riding with the same path is boring. 

  One day, oooccc1 got an idea! Why could I take another path? Tired at all the tasks he got, he got no time to carry it out. As a best friend of his, you’re going to help him! 

  Since oooccc1 is now getting up earlier, he is glad to take those paths, which are a little longer than the shortest one. To be precisely, you are going to find all the second shortest paths. 

  You would be given a directed graph G, together with the start point S which stands for oooccc’1 his house and target point E presents his office. And there is no cycle in the graph. Your task is to tell him how long are these paths and how many there are.

Input

There are some cases. Proceed till the end of file. 

The first line of each case is three integers N, M, S, E (3 <= N <= 50, 0 <= S , E <N) 

N stands for the nodes in that graph, M stands for the number of edges, S stands for the start point, and E stands for the end point. 

Then M lines follows to describe the edges: x y w. x stands for the start point, and y stands for another point, w stands for the length between x and y. 

All the nodes are marked from 0 to N-1.

Output

For each case,please output the length and count for those second shortest paths in one line. Separate them with a single space.

Sample Input

3 3 0 2
0 2 5
0 1 4
1 2 2

Sample Output

6 1

题解:题目已经说明题意了;我们可以记录最短路和短路的长度及其次数并不断更新他们。每次更新是无非5种情况:比最小值小,等于最小值,大于最小值小于次小值,等于次小值,大于次小值;

AC代码为:

/*

题意:给你N个点M条有向边,开始点s,终点e,求 s到e的次最短路,输出次最短路的长度和条数

*/

#include<bits/stdc++.h>

using namespace std;

#define MAX 1100

#define INF 999999999

struct edge

{

    int from,to,w;

};

vector<edge> edges;

vector<int> G[MAX];

int m,n;

int dis[MAX][2],vis[MAX][2],cnt[MAX][2];

int s,e;

void addedge(int x,int y,int w)

{

    edge a={x,y,w};

    edges.push_back(a);

    G[x].push_back(edges.size()-1);

 

}

void dijkstra(int x,int y)

{

    for(int i=0;i<=n;i++)

    {

        dis[i][0]=dis[i][1]=INF;

        cnt[i][0]=cnt[i][1]=INF;

    }

    dis[x][0]=0;

    cnt[x][0]=1;

    memset(vis,0,sizeof(vis));

    for(int i=1;i<=n*2;i++)

    {

        int min=INF,u=-1,flag;

        for(int j=0;j<n;j++)

        {

            if(!vis[j][0]&&min>dis[j][0])

            {

                min=dis[j][0];

                flag=0;

                u=j;

            }

            else if(!vis[j][1]&&min>dis[j][1])

            {

                min=dis[j][1];

                flag=1;

                u=j;

            }

        }

        if(u==-1) break;

        vis[u][flag]=1;

        

        for(int j=0;j<G[u].size();j++)

        {

            edge v=edges[G[u][j]];

            if(min+v.w<dis[v.to][0])

            {

                dis[v.to][1]=dis[v.to][0];

                cnt[v.to][1]=cnt[v.to][0];

                dis[v.to][0]=min+v.w;

                cnt[v.to][0]=cnt[u][flag];

            }

            else if(min+v.w==dis[v.to][0]) cnt[v.to][0]+=cnt[u][flag];

            else if(min+v.w==dis[v.to][1]) cnt[v.to][1]+=cnt[u][flag];

            else if(min+v.w<dis[v.to][1])

            {

                dis[v.to][1]=min+v.w;

                cnt[v.to][1]=cnt[u][flag];

            }

        }

        

    }

    printf("%d %d\n",dis[e][1],cnt[e][1]);

}

int main()

{

   while(scanf("%d %d %d %d",&n,&m,&s,&e)!=EOF)

   {    

        for(int i=0;i<=n;i++) G[i].clear();

        edges.clear();

        for(int i=1;i<=m;i++)

        {

            int x,y,w;

            scanf("%d %d %d",&x,&y,&w);

            addedge(x,y,w);

        }

        dijkstra(s,e);

   }

   return 0;

}

HDU3191-How many paths are there(次短路的长度及其个数)的更多相关文章

  1. hdu 3191 次短路的长度和个数

    http://acm.hdu.edu.cn/showproblem.php?pid=3191 求次短路的长度和个数 相关分析在这里http://blog.csdn.net/u012774187/art ...

  2. COJ 0579 4020求次短路的长度

    4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...

  3. Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心

    题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...

  4. Codeforces 545E. Paths and Trees 最短路

    E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...

  5. Codeforces Round #303 (Div. 2)E. Paths and Trees 最短路

    E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  6. Codeforces 545E. Paths and Trees[最短路+贪心]

    [题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...

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

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

  8. HDU 6181:Two Paths(次短路)

    Two Paths Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others) Total S ...

  9. hdu3191+hdu1688(求最短路和次短路条数,模板)

    hdu3191题意:求出次短路的长度和条数 #include<iostream> #include<cstdio> #include<cstring> #inclu ...

随机推荐

  1. C++程序员学Python

    目录 C++程序员学Python 第二章.变量和数据类型 1.注释语句前用#: 2.常用于大小写函数: 第三章.列表 1.列表简述 2.修改,增加,插入,删除列表元素 第四章操作列表 1.遍历 2.创 ...

  2. java笔试面试第二天

    没想到第二次面试到了第二周,也是我在上海找工作的第二周,说实话,没有真本事找工作是真的难,虽然正在召开的十九大上,大大们纷纷表态国力正盛,经济稳步增长,就业压力逐渐缓解,但是社会终究是社会,要么靠实力 ...

  3. Linux运维利器之ClusterShell

    一.简介 实验室机房有大概百台的服务器需要管理,加上需要搭建Hadoop以及Spark集群等,因此,一个轻量级的集群管理软件就显得非常有必要了.经过一段时间的了解以及尝试,最终选择了clustersh ...

  4. 🔥「课代表」帮你总结了全网最全的Redis知识点

    你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图.个人联系方式和人才交流群,欢迎Star和指教 ...

  5. 【接口测试】HttpClient+fastJson 总结与案例

    多次理解,反复练习,破釜沉舟. HttpCLient是什么 Apache Jakarta Common 下的子项目 支持 HTTP 协议的客户端编程工具包 支持 HTTP 协议最新的版本 怎么利用Ht ...

  6. Python 命令行之旅:深入 click 之子命令篇

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  7. 护网杯2019 mergeheap --pwn

    护网 又是签到 一天 这道题一开始 不懂得如何泄露 libc 信息,就蒙了  后来群里师傅也是刚刚好 做出 到这里 我就接着做了 . 先看下保护,发现  全开了 然后 就看下流程 大概 就是添加  c ...

  8. 【Luogu P2563】【集训Day 4 动态规划】质数和分解

    题目链接:Luogu P2563 质数和分解(prime) [问题描述] 任何大于 1 的自然数 N,都可以写成若干个大于等于2且小于等于 N 的质数之和表达式(包括只有一个数构成的和表达式的情况), ...

  9. nginx(二):基本应用

    配置文件详解 event段配置 worker_connections #; 每个worker进程所能够响应的最大并发请求数量: nginx最大并发响应数=worker_proceses * worke ...

  10. JS三座大山再学习(三、异步和单线程)

    本文已发布在西瓜君的个人博客,原文传送门 前言 写这一篇的时候,西瓜君查阅了很多资料和文章,但是相当多的文章写的都很简单,甚至互相之间有矛盾,这让我很困扰:同时也让我坚定了要写出一篇好的关于JS异步. ...