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. ASP.NET Core 1.0: API的输入参数

    Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...

  2. EFCore批量操作,你真的清楚吗

    背景 EntityFramework Core有许多新的特性,其中一个重要特性便是批量操作. 批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令,而是在一次SQL请求 ...

  3. nyoj 28-大数阶乘 (大数模板)

    28-大数阶乘 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:19 submit:39 题目描述: 我们都知道如何计算一个数的阶乘,可是,如果这个数 ...

  4. nyoj 67-三角形面积 (海伦公式, 叉积)

    67-三角形面积 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:13 难度:2 题目描述: 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入描 ...

  5. nyoj 82-迷宫寻宝(一) (多重BFS)

    82-迷宫寻宝(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:5 难度:4 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...

  6. 领扣(LeetCode)N叉树的层序遍历 个人题解

    给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...

  7. django_5:表单1

    CSRF( Cross Site Request Forgery)跨站点请求欺骗 方法一. {% csrf_token %} 方法二.在setting.py中注释掉MIDDLEWARE中的'djang ...

  8. String类的详细

    String str = new String("abc")创建过程 (1) 先定义一个名为str的对String类的对象引用变量放入栈中. (2) 然后在堆中(不是常量池)创建一 ...

  9. 关于.ssh目录下的known_hosts文件的补充

    一.关于.ssh目录下的known_hosts文件的补充 其实一开始是没有注意到的,按照网上的教程一步一步操作,并没有注意到这个文件的生成.直到有一次我试着去查询.ssh目录是否存在时,出现了下面的情 ...

  10. Fortran流程控制与逻辑运算、循环--xdd

    1.IF语句 1 if() then ... end if 2 if() then ... else ... end if 3 if() then ... else if() then ... els ...