WuKong 最短路加DP HDU 2833

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题意:

 给定一个无向图,和两对起点终点,求两条最短路上的最多公共交点数。

题解:

首先有个很强的性质:

  所有公共点必定连续。

可以用反证法证明:

若a,b 为公共点,且他们不连续。

因为他们不连续,所以a到b至少有两条长度不同都路

与a,b为最短路上的公共点矛盾,最短路长度必然是确定的。

 

用cnt[i][j]在做最短路的时候记录下从i到j的包含节点数最多的最短路。

因为公共点是连续的,所以可以枚举公共点的起点终点。

假设给定的两对起点终点为s1,e1,s2,e2

若dis[s1][i]+dis[i][j]+dis[j][e1]==dis[s1][e1],则i,j在s1到e1的最短路上,若他也在s2到e2的路上就可以,将cnt[i][j]与ans比较,记录下来。

 

代码:

 

/* 

 * File:   main.cpp

 * Author: swordholy

 *

 * Created on 2011年1月15日, 上午10:56

 */

//这里cnt[i][j]记录的是i到j的边数。

#include <cstdlib>

#include <stdio.h>

#include <memory.h>

using namespace std;

#define MAXN 305

#define INF 200000000

/*

 * 

 */

int n,d[MAXN][MAXN],cnt[MAXN][MAXN],a[MAXN][MAXN];

void Floyd()

{

    int i,j,k;

    for(i=1;i<=n;i++)

        for(j=1;j<=n;j++)

            cnt[i][j]=1;

    for(i=1;i<=n;i++)

        cnt[i][i]=0;

    for(k=1;k<=n;k++)

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

        {

                if (a[i][k]+a[k][j]<a[i][j])

                {

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

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

                }

                else if (a[i][k]+a[k][j]==a[i][j]&&cnt[i][k]+cnt[k][j]>cnt[i][j])

                {

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

                }

        }

}

int dp(int s1,int e1,int s2,int e2)

{

    int i,j,k,ans;

    ans=-1;

    for(i=1;i<=n;i++)

        for(j=1;j<=n;j++)

            if ( (a[s1][i]+a[i][j]+a[j][e1]==a[s1][e1])&&(a[s1][e1]<INF)

               &&(a[s2][i]+a[i][j]+a[j][e2]==a[s2][e2])&&(a[s2][e2]<INF)

               &&(cnt[i][j]>ans) )

                ans=cnt[i][j];

        return ans+1;

}

int main(int argc, char** argv)

{

    int i,m,j,x,y,z,s1,e1,s2,e2;

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

    {

        if (n==0&&m==0) break;

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

                if (i!=j)

                  a[i][j]=INF;

                else a[i][j]=0;

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

        {

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

            if (a[x][y]>z)

            a[x][y]=a[y][x]=z;

        }

        scanf("%d %d %d %d",&s1,&e1,&s2,&e2);

        Floyd();

        printf("%d/n",dp(s1,e1,s2,e2));

    }

    return 0;

}

 

如何找回mysql删除的表_mysql误删表如何恢复,恢复被删除表的步骤说明 小编寄语想必大家都知道,Oracle ACE李真旭(Roger)是国内专业的Oracle 数据库恢复专家。但知识都是触类旁通,真正的专家,从来不会局限在一个方向上。今天分享的内容,是他在MySQL数据恢复上所做的尝试。本文主要分享在没有备份的情况下,MySQL数据库如何恢复被删除的表。包含两个主要的场景:1、drop table后的恢复2、truncate table后的恢复正文:我们都知道,M... 阅读详情

相关推荐

Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键

weixin_42529366的博客 1164

寻找两条短路公共路径

近,Elaxia 和 w** 的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的时间。Elaxia 和 w** 每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。现在已知的是 Elaxia 和 w** 所在的宿舍和实验室的编号以及学校的地图:地图上有n个路口,m条路,经过每条路都需要一定的时间。具体地说,就是要求无向图中,两对点间短路最长公共路径。

axibaxhf的博客 527

【ROS2】RViz2载URDF模型文件

1)运行RViz2rviz22)添组件:RobotModel3)选择通过文件添4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可

郭老二 1423

洛谷P2516 [HAOI2010]最长公共子序列(LCS,短路

洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? 设字符串长度为\(n,m\),那么想象我们有一个\(n+1\)行\(m+1\)列的网格图,只能从左下角往右、上两个方向走。定义每条路径的长度都为\(1\)。记第\(i\)行第\(j\)列为...

a83229442的博客 286

洛谷P2149 [SDOI2009]Elaxia的路线--两对点间短路最长公共路径

题目描述 近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。 Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中...

weixin_43918046的博客 561

DP短路联系 && 优贸易 —— DP + 短路

DP短路联系 以0−10-10−1背包为例 转移方程为 f(i,j)=max(f(i-1,j),f(i-1,j-w)+v) 可以看成图论中的路径; 有以下关系; 这启发我们,如果一个DP问题的依赖关系不具有拓扑序,那么我们可以用短路算法来解决这种DP不能解决的问题; 比如说像下图这种形成了环路的,用DPDPDP是没法解决的; 但是我们可以用短路来解决; 题面 传送门 思路 要求一次买入卖出可以得到的大收益; 我们设定集合为先买后卖的所有方案中的大值; 将上述集合划分成若干个子集;

weixin_45724872的博客 1013

Dijkstra算法,求短路dp 动态规划)

•迪杰斯特拉(Dijkstra)算法思想 按路径长度递增次序产生短路径算法: 把V分成两组: (1)S:已求出短路径的顶点的集合 (2)V-S=T:尚未确定短路径的顶点集合 将T中顶点按短路径递增的次序入到S中, 保证:(1)从源点V0到S中各顶点的短路径长度都不大于                       从V0到T中任何顶点的

Manton's blog 3752

HDU 2833 WuKong(floyd短路

题目地址:HDU 2833 这题想到了后是通过dis[s][t]==dis[s][i]+dis[i][j]+dis[j][t]的思路来判定是否属于短路的一条。。但是没想到可以用floyd来找短路中的点数。。。短路还是太渣了。。好多性质都不会利用。。 这题的思路就是通过floyd对每两个点之间的短路条数进行计数,然后通过上面的公式(对两条路线均要判定,都符合才说明都可以走),再找短路

scf0920 1307

hdu 2833 WuKong短路 + dp

WuKong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1027    Accepted Submission(s): 366 Problem Description Liyuan wanted to rewrite

WEYuLi的专栏 1407

HDU 2833 WuKong 【floyd短路 + dp

传送门 // 题意: 给定一幅无向图(n, m), 给定两对起点和终点, 问这两对起终点的短路多可以重合多少个点. (也就是多可以经过多少个相同的点), // 很明显的经过的相同点必是连续的, 我们设dp[i][j] 表示 i 到 j的短路径上的点数, 然后我们怎么更新这个值了, 那就是我们在做floyd的时候, 当一条边可以被松弛的时候, dp[i][j] = dp[i][k] +

Anxdada -- 我等风来也等你 594

HDU 2833 WuKong

传送门 求两条短路多重叠的点数。 给一个无向图,再给两对起点终点,每一对起点终点之间都可能有多条短的路,设s1和t1的短路是r1,s2和t2的短路是r2,求r1和r2多能相互重叠多少个点。 这道题思想很巧妙,涉及了dp的思想。首先想明白一个问题,两条短路的重叠部分必然是连续的,不可能有两段或更多段分散的重叠部分。为什么?反证法,若有的话,则某两段重叠部分之间的各自的分散部分一定可以都...

Crossing over 236

hdu 2833 WuKong(短路径+记忆化搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=2833 大致题意:给定一个无向图,以及悟空和师傅起点与终点,求它们分别从起点到终点的短路径中经过相同的点的大个数。 思路:首先dijkstra求出短路,那么如果有dis[a] + map[a][b] = dis[b],则边(a,b)一定在短路径上。根据这一定理可以求出所有短路径。然后

1126

HDU2833 WuKong(floyd + dp)经典

WuKong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1429    Accepted Submission(s): 517 Problem Description Liyuan wanted to rewrite

青山绿水之辈 专栏 1135

HDU 2833 WuKong(floyd+dp

题意:给你一张图,以及2对点,要求这2对点的短路多能有多少点是共有的。 在做floyd的时候上一个数组num来代表从i到j短路多能有几个点。 然后枚举i,j,如果i到j是起点a到终点b的短路上的,那么dis[a][b] = dis[a][i]+dis[i][j]+dis[j][b],或者 dis[a][b] = dis[b][i]+dis[i][j]+dis[j][a] 然后这

glq007的acm的奋斗 548

DP WuKong hdu2833

挺好的一道题 想到对于任意两点(可相同),如果两路径都经过那么一定是走同样的两点之间的短路 这道题就迎刃而解啦 代码如下: /* ^^ ====== ^^ ID: meixiuxiu PROG: test LANG: C++11 */ #include #include #include #include #include #include #include #incl

meixiuxiudd的博客 362

HDU 2833 WuKong 求两条短路公共点数

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2833题意两个人从两个点出发(不一定是同一个点),到达两个点(不一定是同一个点),问他们的短路多可以有几个公共点。思路dp[i][j] 代表I到j这条短路多有几个点。#include<cstdio> #include<queue> #include<iostream> #include<vect

chen_minghui的博客 328

HDU 2833 WuKong 弗洛伊德+dp

http://acm.hdu.edu.cn/showproblem.php?pid=2833、 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 tr...

xiji333的博客 325

HDU 2833 WuKong 短路径+DP

WuKong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1375    Accepted Submission(s): 496 Problem Description Liyuan wanted to rewrite t

小人物的草稿本 1013

hdu2833 WuKong

给定两个起点终点,求两条短路径上的多交集点数。 求了短路之后,枚举两条路上每条必然属于短路径上的路径,(d[u]+w==d[v],则该条路径必然在短路径上) dp[a][b]表示以a b为终点的多交集点数。 #include #include #include #include #include #include #include #includ

Unknown 866

HDU2833 WuKong floyd+DP

传送门:【HDU2833 WuKong ti m

poursoul 809
上一篇: zz一辈子的好人
下一篇: In Action 最短路加背包 HDU 3339
SwordHoly
博客等级 码龄18年 99粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值