HDU 2833——wukong

HDU 2833WuKong 【Floyd】 Problem DescriptionLiyuan 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 yea 阅读详情

dijskra算法+搜索

首先分别求出悟空和唐僧各自的最短路径,然后记忆化搜索。

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 302
#define INF 10001
int map[maxn][maxn],dis1[maxn],dis2[maxn];
int dp[maxn][maxn];
void dij1(int s,int e,int n)
{
	bool que[maxn];
	int i,j;
	memset(que,0,sizeof(que));
	for(i=1;i<=n;i++)
		dis1[i]=INF;
	dis1[s]=0;
	int temp,k;
	for(i=1;i<=n;i++)
	{
		temp=INF;
		for(j=1;j<=n;j++)
			 if(!que[j]&&temp>dis1[j])
			 {
				 temp=dis1[j];
				 k=j;
			 }
		que[k]=1;
		for(j=1;j<=n;j++)
			if(!que[j]&&dis1[j]>dis1[k]+map[k][j])
				dis1[j]=dis1[k]+map[k][j];
	}
}
void dij2(int s,int e,int n)
{
	bool que[maxn];
	int i,j;
	memset(que,0,sizeof(que));
	for(i=1;i<=n;i++)
		dis2[i]=INF;
	dis2[s]=0;
	int temp,k;
	for(i=1;i<=n;i++)
	{
		temp=INF;
		for(j=1;j<=n;j++)
			 if(!que[j]&&temp>dis2[j])
			 {
				 temp=dis2[j];
				 k=j;
			 }
		que[k]=1;
		for(j=1;j<=n;j++)
			if(!que[j]&&dis2[j]>dis2[k]+map[k][j])
				dis2[j]=dis2[k]+map[k][j];
	}
}
int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
int dfs(int a,int b,int n)  
{  
    if(dp[a][b]>-1)  
        return dp[a][b];  
    int i,j,v=0;  
    for(i=1;i<=n;i++)  
          if(dis1[i]+map[i][a]==dis1[a])  
                   v=max(v,dfs(i,b,n)); 
    for(j=1;j<=n;j++)  
          if(dis2[j]+map[j][b]==dis2[b])  
              v=max(v,dfs(a,j,n));  
    if(a==b)
		v++;  
    dp[a][b]=v;  
    return v;  
}  
int main()
{
	int n,m;
	int s,e,cost;
	int a,b,c,d;
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
	{
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				dp[i][j]=-1;
				map[i][j]=INF;
			}
		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d",&s,&e,&cost);
			if(map[s][e]>cost)
				map[s][e]=map[e][s]=cost;
		}
		scanf("%d%d%d%d",&a,&b,&c,&d);
		dij1(a,b,n);
		dij2(c,d,n);
		if(a!=c)
			dp[a][c]=0;
		else
			dp[a][c]=1;
	printf("%d\n", dfs(b,d,n));
	}
	return 0;
}


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

相关推荐

HDU 2833 WuKong(floyd最短路)

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

scf0920 1306

hdu2833 WuKong

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

Unknown 866

HDU 2833 WuKong 最短路

WuKong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 208 Accepted Submission(s): 88   Problem Description Liyua

窦小雨的小点子 351

hdu 2833 WuKong

Dijkstra+记忆化搜索 首先用Dijkstra分别找到悟空和唐僧从起到终点的最短路径 最短路径的性质d[i] + edge[i][j] == d[j] 其中j为最短路径上的点,则i也为最短路径上的点。 由这个性质我们可以从终点逆向找到所有的最短路径上的点,做一遍记忆化搜索就可以得到结果。 #include #include #include using nam

tju_virus的专栏 559

hdu 2833 WuKong【floyd】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2833 题意:悟空有一个起点终点,唐僧有一个起点终点,求他俩最短路径上最多 的交点个数。 分析:首先要知道它们的最多交点一定是一段连续的路径,因为如果不是连续的 则说明存在其他最短路段,都最短而最多交点不连续矛盾,我表达力不强不信就 试试。 然后可以用floyd跑全图的最短路,并且记录任意两

letterwuyu的专栏 762

HDU2833 WuKong Floyd

/* Floyd的应用 用Floyd求出任意两点间的最短路径 两个定理: 1.所求的路径一定是一断连续的路径 2.如果路径(x,y)是a->b的最短路径中的一段,则min(a,b) = min(a,x) + min(x,y) + min(y,b) 最后只需找到同时在两条最短路径上,且距离最长的那一段 */ #include using namespace std; const int inf=

幸福在路上 1404

WuKong-HDU2833

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2833 题意:给定无向图,求两条最短路A->B,C->D,问这两条最短路的公共点最多有多少个 思路:1:floyd预处理所有点对最短路:           2:记忆化搜索: 首先A->B的最短路径,可以形成一棵有根树, 沿着A->B的最短路径形成的树,从A开始搜索, dp[u],表示从u->B

wen_xp的专栏 470

DP WuKong hdu2833

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

meixiuxiudd的博客 362

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

青山绿水之辈 专栏 1134

HDU-2833-WuKong

ACM模版描述题解很有趣的一道题……给定一个无向图,和两对起点终点,求两条最短路上的最多公共交点数。 可以dp+Floyd(代码One)搞搞,也可以dij+dfs(代码Two)搞搞,记忆化搜索,其实说白了都是dp。代码One:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>using name

逐梦者 569

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

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

WuKong 最短路加DP HDU 2833

<br />题意:<br /> 给定一个无向图,和两对起点终点,求两条最短路上的最多公共交点数。<br />题解:<br />首先有个很强的性质:<br />  所有公共点必定连续。<br />可以用反证法证明:<br />若a,b 为公共点,且他们不连续。<br />因为他们不连续,所以a到b至少有两条长度不同都路<br />与a,b为最短路上的公共点矛盾,最短路长度必然是确定的。<br /> <br />用cnt[i][j]在做最短路的时候记录下从i到j的包含节点数最多的最短路。<br />因为公共点是

SwordHoly __传说中的圣剑,攻击力加250,ORZ!! 1284
上一篇: HDU 1596——find the safest road
下一篇: HUD 1978——How many ways
softrice
博客等级 码龄14年 24粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值