我的hdu2833

#include <iostream> using namespace std;   const int inf=200000000;  int s[305][305];//记录最短路的长度 int num[305][305];//同样长度的最短路的最长的跳数   int main() { 	int n, m, i, j, k, a, b, c, d, ans, start, end, dis; 	while(scanf("%d%d", &n, &m), m || n) 	{ 		memset(num, 0, sizeof(num)); 		for(i = 0; i <= n; i++) 		{               for(j = 0; j <= n; j++)                  s[i][j]=(i==j)?0:inf;                }   		for(i = 0; i < m; i++) 		{ 			scanf("%d%d%d", &start, &end, &dis); 			if(s[start][end] < dis) 				continue; 			s[start][end] = dis; 			s[end][start] = dis; 			num[start][end] = 1; 			num[end][start] = 1; 		} 		for(k=1;k<=n;k++) 		{   			for(i=1;i<=n;i++) 			{   				for(j=1;j<=n;j++) 				{   					if(s[i][j]>s[i][k]+s[k][j]) 					{ 						s[i][j]=s[i][k]+s[k][j]; 						num[i][j] = num[i][k] + num[k][j]; 					} 					else if (s[i][j] == s[i][k] + s[k][j] && num[i][j] < num[i][k] + num[k][j]) 						num[i][j] = num[i][k] + num[k][j]; 				}      			}      		} 		scanf("%d%d%d%d", &a, &b, &c, &d); 		ans = -1; 		for(i = 1; i <= n; i++) 		{ 			for(j = 1; j <= n; j++) 			{ 				if(num[i][j] > ans && (s[a][b] == s[a][i] + s[i][j] + s[j][b]) && (s[c][d] == s[c][i] + s[i][j] + s[j][d]))//num,果然是向中间压// 					ans = num[i][j]; 			} 		} 		printf("%d\n", ans + 1); 	} 	return 0; 


倒数第二句,果然是两边向中间压的,另外我用了set导致太过复杂,其实只要一个二维数组就行了。
可以看看hdu的2833,我用了dsf+dij总是wa,用floyd+dp总是超时…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值