Liyuan wanted to rewrite the famous book “Journey to the West” (“Xi You Ji” in Chinese pinyin). In the original book, the Monkey King Sun Wukong was trapped by the Buddha for 500 years, then he was rescued by Tang Monk, and began his journey to the west. Liyuan thought it is too brutal for the monkey, so he changed the story: 

One day, Wukong left his home - Mountain of Flower and Fruit, to the Dragon   King’s party, at the same time, Tang Monk left Baima Temple to the Lingyin Temple to deliver a lecture. They are both busy, so they will choose the shortest path. However, there may be several different shortest paths between two places. Now the Buddha wants them to encounter on the road. To increase the possibility of their meeting, the Buddha wants to arrange the two routes to make their common places as many as possible. Of course, the two routines should still be the shortest paths. 

Unfortunately, the Buddha is not good at algorithm, so he ask you for help.

Input

There are several test cases in the input. The first line of each case contains the number of places N (1 <= N <= 300) and the number of roads M (1 <= M <= N*N), separated by a space. Then M lines follow, each of which contains three integers a b c, indicating there is a road between place a and b, whose length is c. Please note the roads are undirected. The last line contains four integers A B C D, separated by spaces, indicating the start and end points of Wukong, and the start and end points of Tang Monk respectively. 

The input are ended with N=M=0, which should not be processed.

Output

Output one line for each case, indicating the maximum common points of the two shortest paths.

Sample Input

  1. 6 6
  2. 1 2 1
  3. 2 3 1
  4. 3 4 1
  5. 4 5 1
  6. 1 5 2
  7. 4 6 3
  8. 1 6 2 4
  9. 0 0

Sample Output

  1. 3
  2. Hint: One possible arrangement is (1-2-3-4-6) for Wukong and (2-3-4) for Tang Monk. The number of common points are 3.

题解:题意题目已给,就是悟空和唐僧分别从s1,s2出发,然后到达t1,t2.求在保证两个人走的都是最短路的前提下,两个人共同经过的地点的数量的最大值;我们可以推出 : 如有几个公共地点,则这些点必定为连续的点;然后,处理一下各个点相互之间的最短距离,若满足dis[s1][i]+dis[i][j]+dis[j][t1]=dis[s1][t1],则i~j即为一段,然后利用DP不断更新,处理处其最大值即可;

AC代码为:

//找分别为s1 t1,s2 t2 最短路径最多相同的地点 

#include<bits/stdc++.h>

using namespace std;

const int INF=0x3f3f3f3f;

int N,M,U,V,W,A,B,C,D;

int dis[310][310],dp[310][310];

void Folyd()

{

    for(int k=1;k<=N;k++)

    {

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

        {

            for(int j=1;j<=N;j++)

            {

                if(i==j||j==k||i==k) continue;

                if(dis[i][j]>dis[i][k]+dis[k][j])

                {

                    dis[i][j]=dis[i][k]+dis[k][j];

                    dp[i][j]=dp[i][k]+dp[k][j]-1;   

                }

                else if(dis[i][j]==dis[i][k]+dis[k][j])

                    dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]-1);     

            }

        }

    }

}

int work(int s1,int t1,int s2,int t2)

{

    int ans=0;

    if(dis[s1][t1]>=INF||dis[s2][t2]>=INF) return 0;

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

    {

        for(int j=1;j<=N;j++)

        {

            if(dis[s1][i]+dis[i][j]+dis[j][t1]==dis[s1][t1]&&dis[s2][i]+dis[i][j]+dis[j][t2]==dis[s2][t2])

            {

                ans=max(ans,dp[i][j]);

            }

        }

    }

    return ans;

}

int main()

{

    ios::sync_with_stdio(false);

    cin.tie(0);

    while(cin>>N>>M)

    {

        if(!N && !M) break;

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

        {

            for(int j=1;j<=N;j++) 

            {

                dis[i][j]=INF;

                dp[i][j]=2;

            }

            dis[i][i]=0;

            dp[i][i]=1;

        }

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

        {

            cin>>U>>V>>W;

            dis[U][V]=dis[V][U]=min(W,dis[U][V]);

        }

        cin>>A>>B>>C>>D;

        Folyd();

        cout<<work(A,B,C,D)<<endl;

    } 

    return 0;   

}

HDU2833-WuKong(求不同起点,终点最短路的交点最多数量)的更多相关文章

  1. POJ - 3268 Silver Cow Party SPFA+SLF优化 单源起点终点最短路

    Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to ...

  2. java实现根据起点终点和日期查询去哪儿网的火车车次和火车站点信息

    本文章为原创文章,转载请注明,欢迎评论和改正. 一,分析 之前所用的直接通过HTML中的元素值来爬取一些网页上的数据,但是一些比较敏感的数据,很多正规网站都是通过json数据存储,这些数据通过HTML ...

  3. 洛谷p2149----两个终点和两个起点,最短路最大交汇长度!!!

    说实话,这题真第一次见,学到了不少有趣的东西,因吹丝汀!! 思路:因为不可能同时并行和相遇(我也不知道为啥,等我会证明了就来说说) 所以正向建边再反向建边,拓扑排序+dp求最下长路,记录下最大的就是解 ...

  4. Bellman-Ford 求含负权最短路

    该算法详解请看   https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 单源最短路   当图中存在负权边时 迪杰斯特拉就 ...

  5. python脚本,计算起点终点高程

    import arcpy >>> import arcpy ... gd="D:/项目/shp/Pipe.gdb/ZK/GDPOINT" ... gx=" ...

  6. NX二次开发-创建圆弧(起点-终点-半径)UF_CURVE_create_arc_point_point_radius

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> UF_initialize(); //起点 ]; ArcStartPoint[ ...

  7. 2018中国大学生程序设计竞赛 - 网络选拔赛 hdu Tree and Permutation 找规律+求任意两点的最短路

    Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. 算法基础⑧搜索与图论--dijkstra(迪杰斯特拉)算法求单源汇最短路的最短路径

    单源最短路 所有边权都是正数 朴素Dijkstra算法(稠密图) #include<cstdio> #include<cstring> #include<iostream ...

  9. POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量

    题目链接:http://poj.org/problem?id=1523 SPF:A Single Point of Failure也就是割点(一个点导致网络之间的不连通),由于给出的图是无向图,所以只 ...

随机推荐

  1. nyoj 70-阶乘因式分解(二)(数学)

    70-阶乘因式分解(二) 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:7 难度:3 题目描述: 给定两个数n,m,其中m是一个素数. 将n(0<=n<=2 ...

  2. oracle:表重命名

    SQL> rename test1 to test; Table renamed. SQL> alter table test rename to test1; Table altered ...

  3. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  4. 转:MySQL中变量的定义和变量的赋值使用(转)

    MySQL中变量的定义和变量的赋值使用(转)   说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...

  5. RabbitMQ的入门学习

    RabbitMq消息队列 参考:https://blog.csdn.net/hellozpc/article/details/81436980 什么是消息队列 MQ :message Queue ,实 ...

  6. 天啦!竟然从来没有人讲过 SpringBoot 支持配置如此平滑的迁移

    SpringBoot 是原生支持配置迁移的,但是官方文档没有看到这方面描述,在源码中才看到此模块,spring-boot-properties-migrator,幸亏我没有跳过.看到这篇文章的各位,可 ...

  7. Siamese-RPN论文阅读

    https://www.cnblogs.com/zhengyuqian/p/10609737.html

  8. Java流程控制之(一)条件

    目录 条件语句 单if情况 单if/else情况 if/else多分支情况 switch条件语句 条件语句+循环语句,直接甩图甩代码! 条件语句 Java希望在某个条件为真时执行相应的语句. 单if情 ...

  9. Python常见字符串方法函数

    1.大小写转换 S.lower() S.upper() 前者将S字符串中所有大写字母转为小写,后者相反 S.title() S.capitalize() 前者返回S字符串中所有单词首字母大写且其他字母 ...

  10. Python执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...