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. 虚幻4 UE4 蓝图之关卡蓝图实现自动开关门

    新建项目 往关卡中放置一个门 在内容浏览器中找到 门 的静态网格体 拖放到关卡中 此时门默认没有碰撞,人物可以直接穿过 给门添加碰撞 双击内容管理器中的 SM_Door,打开编辑窗口 选择菜单&quo ...

  2. 用户环境变量 shell变量 别名

    常见用户环境变量: 环境变量 说明 LANG   HOME   LOGNAME 用户名 PATH   SHELL   PWD   查看环境变量用:env或者echo $LANG 设置用户环境变量:ex ...

  3. Ubuntu 16.04安装ROS Kinetic详细教程 | Tutorial to Install and Configure ROS Kinetic on Ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/e2780b93/,欢迎阅读! Tutorial to Install and Configure ROS Kinetic on U ...

  4. 异步任务AsyncTask使用解析

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

  5. beta week 2/2 Scrum立会报告+燃尽图 01

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9954 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  6. Oracle数据库索引

    Oracle数据库索引 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索 ...

  7. javaScript——label语句

    第一次看见label语句是这样一个场景: function foo() {x: 1} 当时十分疑惑,为什么不报错呢?对象可以这样写? 后来知道这个是label语句,一般配合break和continue ...

  8. 2019-9-11:渗透测试,基础学习,ubuntu搭建LAMP

    一,apache web服务器安装 1,sudo apt-get install apache2 2,systemctl status apache2,检查apache2是否开启 #开启.关闭和重启a ...

  9. Dart Learn Notes 03

    操作符 dart 有一套自己定义的操作符: 这里我就不再写了,直接copy一份官网的. 如果有过编程基础,上边展示的操作符应该都不陌生. 算术运算符 加: + 减: - 乘: * 除: / 取余: % ...

  10. 浅谈集群版Redis和Gossip协议

    昨天的文章写了关于分布式系统中一致性哈希算法的问题,文末提了一下Redis-Cluster对于一致性哈希算法的实现方案,今天来看一下Redis-Cluster和其中的重要概念Gossip协议. 1.R ...